当前位置:  技术问答>linux和unix

socket收发大量数据怎么处理?

    来源: 互联网  发布时间:2016-05-22

    本文导语:  用一次send或recv不能保证发完/收完 这种情况怎么处理? 我想是循环处理,但具体操作不太会 请指教 | 如果数据量很大,不能确保一次read调用返回服务器的整个应答。因此从TCP套接口读取数...

用一次send或recv不能保证发完/收完
这种情况怎么处理?
我想是循环处理,但具体操作不太会
请指教

|
如果数据量很大,不能确保一次read调用返回服务器的整个应答。因此从TCP套接口读取数据时,总是需要把read

编写在某个循环中,当read返回0(对端关闭连接)或负值(错误发生)时终止循环。

这句话是 UNIX网络编程 第一卷 中的原话...

|
循环read好做,但是send要考虑一下对面缓冲区是否有空间接收数据.

|
循环读写,直至完成一个完整数据包的处理。需要考虑的因素,网络传输分片,收发动作被信号中断,缓冲区空间不够等。

|


int write_all( int fd, const void *buff, size_t len){
      const  void *sbuff  = buff;
      size_t      slen    = len;
      int         n_bytes = 0; 
      errno               = 0;
      while( slen > 0 && (nbytes != -1 || errno != EINTR)){
              sbuff += n;
              len   -= n;
              n = write( fd, sbuff, slen);
      }
      return sbuff-buff+( n==-1?0:n);
}

|

int write_all( int fd, const void *buff, size_t len)
{
     const void *sbuff = buff;
     size_t     slen = len;
     int        nbytes = 0; 
     errno = 0; 
     while( slen > 0 && (nbytes != -1 || errno != EINTR)){
  if( nbytes != -1){
       sbuff  += nbytes;
       slen   -= nbytes; 
  }
  nbytes =  write( fd, sbuff, slen); 
     } 
     return sbuff-buff+( n==-1?0:n); 
}

    
 
 

您可能感兴趣的文章:

  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 客户机和服务器可以双向收发数据的socket编程
  • 如何在单线程中通过socket同时实现数据包的收发?
  • 在程序中如何判断一个socket链路在3分钟内没有收发任何信息?
  • 求用socket收发信息的applet
  • socket收发出现乱码的问题,麻烦大家看看
  • 对SOCKET服务器端异常处理的不解!
  • {求救}socket编程处理udp广播
  • 请问一个socket在listen()之后如果把它close()了,那之前已经用子进程处理的连接还在不在?
  • socket传送的内容过长时,怎么处理?我就80分了!
  • 再次请教 unix 下 多线程(进程)中对同一个socket_id处理的问题。
  • socket编程模型,命令流处理问题
  • C# Socket粘包处理讲解示例
  • 请问:在socket编程的服务器端,想采用多线程来处理客户端的命令,应该怎样写啊?
  • Socket传输中文字符处理!!高分求救
  • 通过Socket通信处理XML时遇到的问题,请指教
  • 非阻塞方式socket中, 去读select返回的sockfd是否一定是非0值??如果读到的字节数比期望少有没有什么好的处理模式??
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php实现socket实现客户端和服务端数据通信源代码
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • 创建了2个套接字Raw socket和socket,都调用recvfrom(),一个专门捕获数据包,一个在9001端口监听UDP请求,怎么不行?
  • 从多个socket接收数据
  • 在unix下编写socket,从远端接收数据并存入db2数据库
  • 你是否可以回答Socket的问题?数据先后问题
  • UDP SOCKET编程,不能发送广播数据包
  • vc通过socket发送数据给java的问题
  • socket编程中的带外数据问题
  • 请问如何用socket编程向网页POST数据啊?
  • 移动开发 iis7站长之家
  • socket发送数据问题(50分)
  • socket 接收数据问题
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • 发送大量数据,socket API最优分包长度为多少?
  • linux下的socket接收数据的难题!
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • (socket通信)poll提示有数据可读 recv却返回 EAGAIN
  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • socket 通讯问题!客户端获取服务端数据问题,死活都是0!
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3