当前位置: 技术问答>linux和unix
socket收发大量数据怎么处理?
来源: 互联网 发布时间:2016-05-22
本文导语: 用一次send或recv不能保证发完/收完 这种情况怎么处理? 我想是循环处理,但具体操作不太会 请指教 | 如果数据量很大,不能确保一次read调用返回服务器的整个应答。因此从TCP套接口读取数...
用一次send或recv不能保证发完/收完
这种情况怎么处理?
我想是循环处理,但具体操作不太会
请指教
这种情况怎么处理?
我想是循环处理,但具体操作不太会
请指教
|
如果数据量很大,不能确保一次read调用返回服务器的整个应答。因此从TCP套接口读取数据时,总是需要把read
编写在某个循环中,当read返回0(对端关闭连接)或负值(错误发生)时终止循环。
这句话是 UNIX网络编程 第一卷 中的原话...
编写在某个循环中,当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);
}