如何通过socket读取数据进行大量返回信息的读取

在调用socket读取数据读写函数read(),write()时都會有返回值。如果没有正确处理返回值就可能引入一些问题

1当read()或者write()函数返回值大于0时,表示实际从缓冲区读取或者写入的字节数目

当write()函數返回0时表示当前写缓冲区已满,是正常情况下次再来写就行了。

EAGAIN或者EWOULDBLOCK非阻塞socket读取数据直接忽略;如果是阻塞的socket读取数据,一般是读写操作超时了,还未返回这个超时是指socket读取数据的SO_RCVTIMEO与SO_SNDTIMEO两个属性。所以在使用阻塞socket读取数据时不要将超时时间设置的过小。不然返回了-1伱也不知道是socket读取数据连接是真的断开了,还是正常的网络抖动一般情况下,阻塞的socket读取数据返回了-1都需要关闭重新连接。

在使用epoll时有ET与LT两种模式。ET模式下socket读取数据需要read或者write到返回-1为止。对于非阻塞的socket读取数据没有问题但是如果是阻塞的socket读取数据,正如第三条中所说的只有超时才会返回。所以在ET模式下千万不要使用阻塞的socket读取数据那么LT模式为什么没问题呢?一般情况下使用LT模式,我们只要調用一次read或者write函数如果没有读完或者没有写完,下次再来就是了由于已经返回了可读或者可写事件,所以可以保证调用一次read或者write会正瑺返回

我要回帖

更多关于 socket读取数据 的文章

 

随机推荐