【发布时间】:2021-10-23 22:33:18
【问题描述】:
我正在尝试制作连接到 telnet 的 C 套接字程序,我可以向它发送命令。
我的问题是我只收到一条线。
int sendall(int s, char *buf, int *len)
{
int total = 0; // how many bytes we've sent
int bytesleft = *len; // how many we have left to send
int n;
while(total < *len) {
n = send(s, buf+total, bytesleft, 0);
if (n == -1) { break; }
total += n;
bytesleft -= n;
}
*len = total; // return number actually sent here
return n==-1?-1:0; // return -1 on failure, 0 on success
}
void readall(int sock) {
char buffer[256];
/* Now read server response */
memset(buffer, 0, sizeof(buffer));
int n = recv(sock, buffer, 255, 0);
if (n < 0) {
perror("ERROR reading from socket");
return;
}
printf("%d bytes received buffer is: %s\n", n, buffer);
printf("\n");
}
int main()
{
int network_socket, connection_status;
struct sockaddr_in server_address;
char server_response[256];
network_socket = socket(AF_INET, SOCK_STREAM, 0);
if (network_socket < 0) {
printf("Soccet creation failed\n");
return network_socket;
}
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
server_address.sin_addr.s_addr = inet_addr(IP);
connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address));
if (connection_status == -1) {
printf("Cannot connect to network\n");
return connection_status;
}
char buf[10] = "status";
int a = strlen(buf);
sendall(network_socket, buf, &a);
//send(network_socket, "status", strlen("status"), 0);
readall(network_socket);
//recv(network_socket, &server_response, sizeof(server_response), 0);
printf("server response: %s\n", server_response);
close(network_socket);
}
输出: 服务器响应:>INFO:OpenVPN Management Interface Version 3 -- 输入“帮助”获取更多信息
但这只是第一行,当我连接到 telnet(通过终端 ubuntu)时,我总是得到它。 我尝试使用 sendall 和recall 方法,但无论如何输出都是一样的。 我做错了什么?
【问题讨论】:
-
您连接的服务器似乎在您连接到它时会发送某种信息(您是否尝试过连接实际的
telnet或类似程序?)。您需要阅读所有内容并对其进行解析以找到提示服务器已准备好接受命令的提示。 -
&server_response真的应该是server_response。recv不会 NUL 终止缓冲区,因此如果要将其视为字符串,您需要先将其归零并将缓冲区长度作为sizeof buffer - 1传递。否则,检查/使用返回值来确定字符串长度,并适当终止。 -
为什么你认为你应该收到更多的东西?
-
我不熟悉 OpenVPN 管理界面,但有时这类服务器在看到换行符之前不会响应。您可以尝试将
"status"更改为"status\n" -
我想如果我发送类似“status”的内容,它会返回openvpn的状态,因为它是管理界面中的命令?