recv() 和 send() 的改进——Write() 和 Readn()

1.recv() 和 send() 的缺点

  这recv()函数存在可能读取报文不完整的情况,send()存在可能写入数据不完整的情况。

1.1 recv() 函数的改进——Readn()

ssize_t recv(int sockefd, void *buf, size_t len, int flage);

  (1)函数的返回值是这次接收到数据的大小。但是你打算读取1000个字节,只能读取100个(TCP存在分包的问题)。要将数据读取完,需要采用循环多次调用这个函数。所以将这个函数改进为 Readn()

  (2)Readn() 的声明及参数

bool Readn(const int sockfd,char *buffer,conset size_t n);

  1) sockfd:已经准备好的socket连接。

  2)buffer:接收数据缓冲区的地址

  3)n:本次接收数据的字节数

  4)返回值:成功接收到n字节的数据后返回 true ,socket连接不可用返回false。

(3)函数的实现

bool Readn(const int sockfd,char *buffer,conset size_t n)
{
   int nLeft,nread,idx;
   nLeft = n;
   idx = 0;
   
   while(nLeft > 0)
     {
        if ( (nread = recv(sockfd,buffer + idx,nLeft,0) <= 0)  return false;
        
        idx +=nread;
        nLeft -= nread;
     }
}

1.2 send() 函数的改进——Write()

ssize_t send(int sockefd, const void *buf, size_t len, int flags);

  (1)这个函数的返回值是成功发送的字节数。它存在类似 recv 函数的问题。可能由于缓冲区不足等等原因,要写1000个字节,但是成功写入的只有500。

  (2)Write() 函数的声明及参数

bool Writen(const int sockfd,const char *buffer,const size_t n);

  (3)函数的实现

bool Writen(const int sockfd,const char *buffer,const size_t n)
  {
     int nLeft,idx,nwrite;
     nLeft = n;
     idx = 0;
     while(nLeft > 0)
       {
          if ( (nwrite = send(sockfd,buffer + idx,nLeft,0)) <= 0) return false;
          
          nLeft -= nwrite;
          idx +=nwrite;
       }
       
       return ture;
  }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值