c/c++语言开发共享在socket中发送多个send / recv

我需要在套接字程序中使用多个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 %sn",buf); 

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

客户端消息:Messgfromlient

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

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

输出:第一次试用:

  Client Msg :Messgfromlient Client Msg :cli2 

第二道:

  Client Msg :Messgfromlient Client Msg :cli1 

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

Raja,先谢谢你

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

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

    服务器程序如下所示。

     recv(newsockfd,buf,20,0); printf("Buffer is %sn",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 %.*sn",count,buf); } 

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

    你有2个问题:

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

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

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

      以上就是c/c++开发分享在socket中发送多个send / recv相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549335.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐