socket可读和可写的条件

一、 下列四个条件中的任何一个满足时,socket准备好读: 


 1,socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1; 
 2,连接的读这一半关闭(即:接收到对方发过来的FIN的TCP连接).对于这样的socket的读操作将不阻塞,并且返回0(即:文件结束符,FIN包体长度为0字节); 
 3,socket是一个用于监听的socket,并且已经完成的连接数为非0.这样的soocket处于可读状态,是因为socket收到了对方的connect请求,执行了三次握手的第一步:对方发送SYN请求过来,使监听socket处于可读状态;正常情况下,这样的socket上的accept操作不会阻塞; 
 4,有一个socket有异常错误条件待处理.对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopt来取得并清除; 

注:可读其实是看read或accept操作是否在阻塞的情况下返回,如果能返回表明可读(返回可读的字节数,或者-1,errno记录错误值),否则一直阻塞,表明不可读。

   accept的情况是客户端connect,已经与服务端三次握手了,此时监听的socket处于可读状态,这样如果select,此时返回不会阻塞,或者直接accept也不会阻塞。


  
二、 下列三个条件中的任何一个满足时,socket准备好写 : 


 1,socket发送缓冲区中的可用空间字节数大于等于socket发送缓冲区低潮限度的当前值,且(i):socket已连接(TCP socket),或者(ii):socket不要求连接(如:UDP socket).这意味着,如果我们将这样的socket设置为非阻塞模式,写操作将不会阻塞,并且返回一个正值(如:由传输层接收的字节数).我们可以用socket选项SO_SNDLOWAT来设置此低潮限度,对于TCP和UDP socket,其缺省值一般是2048Bytes; 
 2,连接的写这一半关闭.对于这样的socket的的写操作将产生信号SIGPIPE; (write操作会返回-1)

 3,使用非阻塞connect的套接字已建立连接,或者connect已经以失败告终(失败的时候其实是既可读又可写)。
 4,有一个socket异常错误条件待处理.对于这样的socket的写操作将不会阻塞并且返回一个错误(-1),errno则设置成明确的错误条件.这些待处理的错误也可以通过指定socket选项SO_ERROR调用getsockopt函数来取得并清除;

 

注:当某个套接字上发生错误时,它将select标记为即可读又可写。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章