Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
接收多消息套接字编程C_C_Sockets_Network Programming - Fatal编程技术网

接收多消息套接字编程C

接收多消息套接字编程C,c,sockets,network-programming,C,Sockets,Network Programming,嗨,我是socket编程新手C。现在我正在开发聊天程序,我可以成功地发送和接收消息,但问题是当客户端请求发送该客户端联机的用户列表时,一旦服务器将消息发送回客户端,消息就成功打印当前连接的客户端列表,但一旦显示,它就不会退出环下面只是代码的一部分 服务器端(server.c) 正确的样本输出 User A -->: //List User A User B User C // Loop User A -->: //List User

嗨,我是socket编程新手C。现在我正在开发聊天程序,我可以成功地发送和接收消息,但问题是当客户端请求发送该客户端联机的用户列表时,一旦服务器将消息发送回客户端,消息就成功打印当前连接的客户端列表,但一旦显示,它就不会退出环下面只是代码的一部分

服务器端(server.c)

正确的样本输出

    User A -->:
    //List 
    User A
    User B
    User C
    // Loop
User A -->:
//List
User A
User B
User C
User A -->:

非常感谢

如果所有邮件大小相同,则可以使用此解决方案。我不知道您的
消息的大小\u replay
,就说它的类型是
char[256]

在服务器上

您可以始终发送256个字节,而不是使用
strlen()。客户端将忽略空终止符后面的所有尾随字符

write(sock , message_replay, 256); // or sizeof(message_replay) if it's static
在客户端

然后,客户端应该期望所有消息的长度为256字节。循环运行直到所有256个字符都被接收,并附加到每个循环的
receive\u buffer[]
。计数器跟踪已接收的字节数和缺少的字节数

for (int i = 0; i < NotEndOFList; i++) {
    char receive_buffer[256];
    int received_bytes = 0;
    int remaining_bytes = sizeof(receive_buffer);

    while (remaining_bytes > 0) {
        int res = recv(sock , &receive_buffer[received_bytes] , remaining_bytes, 0);
        if (res < 0) {
            puts("recv failed");
            break;
        }
        received_bytes += res;
        remaining_bytes -= res;
    }

    puts(receive_buffer);
}
for(int i=0;i0){
int res=recv(sock,&receive_buffer[received_bytes],剩余的_bytes,0);
如果(res<0){
看跌期权(“recv失败”);
打破
}
接收的字节数+=res;
剩余的_字节-=res;
}
puts(接收缓冲区);
}

PS!我还没有测试过,如果您决定使用它,请告诉我它是如何运行的。

不能保证每次在服务器中调用
write
都会导致整个消息被客户端中的单个
recv
读取。您可能需要反复调用
recv
,才能读取单个消息。相反,对
recv
的一次调用可能会从对
write
的多次调用中返回数据。您需要定义一个简单的协议,并使用它来确定clientBtw中接收到多少消息。您应该检查receive_buffer是否真的包含空终止符字符,或者只是在末尾添加一个以确保。在while循环之后,您可以执行
receive\u buffer[sizeof(receive\u buffer)-1]='\0'
。如果服务器决定发送不带空终止符的消息,
put()
-命令将不知道从何处停止读取(当它开始从
已接收字节的内存区域读取时,它可能会停止读取,这太晚了。我明天会尝试,并让您知道谢谢您,顺便说一句,消息的重播大小相同
write(sock , message_replay, 256); // or sizeof(message_replay) if it's static
for (int i = 0; i < NotEndOFList; i++) {
    char receive_buffer[256];
    int received_bytes = 0;
    int remaining_bytes = sizeof(receive_buffer);

    while (remaining_bytes > 0) {
        int res = recv(sock , &receive_buffer[received_bytes] , remaining_bytes, 0);
        if (res < 0) {
            puts("recv failed");
            break;
        }
        received_bytes += res;
        remaining_bytes -= res;
    }

    puts(receive_buffer);
}