Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字recv函数不返回更新的值_C_Linux_Sockets_Recv - Fatal编程技术网

套接字recv函数不返回更新的值

套接字recv函数不返回更新的值,c,linux,sockets,recv,C,Linux,Sockets,Recv,尝试使用c(Linux)创建套接字应用程序以不断从服务器获取数据 为此,我创建了一个循环,例程在其中连接、发送命令、接收一些数据并关闭套接字。 它在第一次交互中运行良好,但看起来recv函数无法从第二次迭代和其他迭代中更新缓冲区变量 尝试使用memset函数清除变量,但这会清除变量,并且在第一次迭代后始终为空 有什么想法吗 下面是我正在使用的代码示例 #include<stdio.h> #include<sys/socket.h> #include<arpa/ine

尝试使用c(Linux)创建套接字应用程序以不断从服务器获取数据 为此,我创建了一个循环,例程在其中连接、发送命令、接收一些数据并关闭套接字。 它在第一次交互中运行良好,但看起来recv函数无法从第二次迭代和其他迭代中更新缓冲区变量

尝试使用
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()
的第一个参数应该是一个格式字符串,而不是要打印的数据。如果您也尝试了,第二个交互程序将中止。现在实现错误处理