gpt4 book ai didi

c - 在套接字中发送多个发送/接收

转载 作者:可可西里 更新时间:2023-11-01 02:55:28 27 4
gpt4 key购买 nike

我需要澄清一下在套接字程序中使用多个发送/接收。我的客户端程序如下所示(使用 TCP SOCK_STREAM)。

    send(sockfd,"Messgfromlient",15,0);
send(sockfd,"cli1",5,0);
send(sockfd,"cli2",5,0);
send(sockfd,"cli3",5,0);
send(sockfd,"cli4",5,0);
send(sockfd,"cli5",5,0);

服务器程序如下所示。

    recv(newsockfd,buf,20,0);
printf("Buffer is %s\n",buf);

当我执行上面的程序时,输出如下:

客户端消息:Messgfromlient

我相信 buf 的大小是 20,所以只接收到一个缓冲区。在服务器端再添加一个 recv。

    char buf[20],buf[20];
------skipped------
recv(newsockfd,buf,20,0);
recv(newsockfd,buf1,20,0);
printf("Client Msg :%s\n",buf);
printf("Client Msg :%s \n",buf1);

输出:第一次试验:

    Client Msg  :Messgfromlient
Client Msg :cli2

第二条路:

   Client Msg  :Messgfromlient
Client Msg :cli1

正如我们所见,输出中存在一些矛盾,从客户端看,所有消息都已发送,但在服务器中,消息将根据 buf 大小接收,这里即使 buf1 的大小为 20,为什么 buf1 上未收到 'cli3''cli4''cli4' 消息?。有没有具体的限制?请澄清这一点。

提前致谢,拉惹

最佳答案

TCP 是一种基于字节流的协议(protocol),它对消息一无所知。您总共发送了 25 个字节,而另一端的每个 recv 将读取这些字节中的一些。你可以得到 20,你可能会得到 1,然后在下一次阅读中得到 19,你可能会得到 5 然后 4 然后是 11 然后是 5。recv 的大小参数是要读取的最大数量。

您需要循环,直到您自己阅读了整条消息,并了解您可能会在收到的同一条消息中收到多个“发送”。

关于c - 在套接字中发送多个发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com