在socket中发送多个send / recv

时间:2016-05-16 09:41:37

标签: c sockets tcp

我需要在套接字程序中使用多个send / recv进行一些澄清。 我的客户端程序如下所示(使用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

我们可以看到输出中存在一些矛盾, 从客户端来看它看起来所有的msg都被发送了,但是在服务器中,msg将根据buf大小接收,这里虽然buf1的大小为20,为什么'cli3''cli4''cli4'msgs没有收到buf1 ?。有没有具体的限制?请澄清一下。

先谢谢, 拉贾

3 个答案:

答案 0 :(得分:4)

TCP是基于字节流的协议,它对消息一无所知。您总共发送25个字节,另一侧的每个recv将读取这些字节的部分。您可以获得20,在下次阅读时可能会获得1然后19,您可能会5然后4然后11然后获得5. {参数recv是要读取的最大数量。

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

答案 1 :(得分:3)

  

服务器程序如下所示。

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

这已经错了。它应该是:

int count = recv(newsockfd,buf,20,0);
if (count == -1)
{
    perror("recv"); // please improve this message
    close(newsocketfd);
}
else if (count == 0)
{
    // peer has closed the connection
    close(newsockfd);
}
else
{
    printf("Buffer is %.*s\n",count,buf);
}

这应该给你足够的暗示......

答案 2 :(得分:2)

你有两个问题:

当您显示结果时,您将停在第一个空字节处,该字节始终位于“Messgfromlient”之后。可能已收到更多文字,但您没有显示它。

第二个问题是TCP连接是一个流。您可以一次性接收所有数据,您可能只收到第一个字节。你不知道它是哪一个,也无法预测它。您需要在应用程序中处理不完整的读取,并且必须处理重试。

但是,您可以更有可能将所有数据都发送到一个数据包而不是6.请查看TCP_CORK选项。