套接字recv函数不返回更新的值
尝试使用c(Linux)创建套接字应用程序以不断从服务器获取数据 为此,我创建了一个循环,例程在其中连接、发送命令、接收一些数据并关闭套接字。 它在第一次交互中运行良好,但看起来recv函数无法从第二次迭代和其他迭代中更新缓冲区变量 尝试使用套接字recv函数不返回更新的值,c,linux,sockets,recv,C,Linux,Sockets,Recv,尝试使用c(Linux)创建套接字应用程序以不断从服务器获取数据 为此,我创建了一个循环,例程在其中连接、发送命令、接收一些数据并关闭套接字。 它在第一次交互中运行良好,但看起来recv函数无法从第二次迭代和其他迭代中更新缓冲区变量 尝试使用memset函数清除变量,但这会清除变量,并且在第一次迭代后始终为空 有什么想法吗 下面是我正在使用的代码示例 #include<stdio.h> #include<sys/socket.h> #include<arpa/ine
memset
函数清除变量,但这会清除变量,并且在第一次迭代后始终为空
有什么想法吗
下面是我正在使用的代码示例
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include <string.h>
int main(int argc , char *argv[])
{
char *message , server_reply[2000];
struct sockaddr_in server;
int socket_desc;
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
server.sin_addr.s_addr = inet_addr("192.168.1.10");
server.sin_family = AF_INET;
server.sin_port = htons( 23 );
int count = 0;
for (;;)
{
printf("\nContador >> %i\n", count);
count++;
connect(socket_desc , (struct sockaddr *)&server , sizeof(server));
send(socket_desc , "command\r" , 2 , 0);
sleep(5);
//Receive a reply from the server
recv(socket_desc, server_reply , 100 , 0);
printf(server_reply); /// This always shows the same values as the first iteraction
sleep(10);
close(socket_desc);
}
return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*消息,服务器_回复[2000];
服务器中的结构sockaddr_;
内部插座描述;
socket\u desc=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字描述==-1)
{
printf(“无法创建套接字”);
}
server.sin_addr.s_addr=inet_addr(“192.168.1.10”);
server.sinu family=AF\u INET;
server.sin_port=htons(23);
整数计数=0;
对于(;;)
{
printf(“\n计数器>>%i\n”,计数);
计数++;
连接(socket_desc,(struct sockaddr*)&server,sizeof(server));
发送(套接字描述,“命令”,2,0);
睡眠(5);
//从服务器接收回复
recv(套接字描述,服务器应答,100,0);
printf(server_reply);///这始终显示与第一个iteraction相同的值
睡眠(10);
关闭(插座描述);
}
返回0;
}
您在第一次迭代结束时关闭了套接字。此后,socket\u desc
不再是有效的文件描述符
如果你真的每次都想要一个新的连接,最简单的解决方法就是把线路接上
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
在你的循环中
正如其他人所说:请检查返回值,准备好处理不是一次性收到所有回复的情况,并修复对printf的调用!仅仅因为这段代码工作过一次,并不意味着它是正确的。您如何知道recv返回了多少数据?您没有检查。没有,从来没有想过这是必要的,因为在第一次循环迭代中得到了正确的命令回复。为什么我需要它?因为返回值提供了发生什么的信息。您应该检查
连接
、发送
和关闭
的返回值。。。如果其中任何一个返回错误代码,请检查errno
以查看导致错误的原因。流套接字不跟踪消息边界,无法保证recv()
将只返回一条消息。它不会向数据添加空终止符,因此不能对其使用printf()
。另外,printf()
的第一个参数应该是一个格式字符串,而不是要打印的数据。如果您也尝试了,第二个交互程序将中止。现在实现错误处理