套接字的默认状态是阻塞的,如果发出一个不能立即完成的套接字调用时,其进程将会被投入睡眠,等待响应的操作完成。可能阻塞的套接字调用:
(1)输入操作,包括read、readv、recv、recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认设置)调用这些函数,且接收缓冲区没有数据可读,该进程将被投入睡眠,直到有一些数据到达。
(2)输出操作,包括write、writev、send、sendto和sendmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认设置)调用这些函数,且发送缓冲区没有空间可写,该进程将被投入睡眠,直到有一些空间空闲。
(3)accept函数
(4)connect函
数,如果对一个非阻塞的TCP套接字调用connect,并且连接不能立即建立,那么连接照样能发起,但会返回一个EINPROCESS错误。可以立即建
立连接的情况通常是服务器和客户处于同一个主机下,因此,即使对于一个非阻塞的connect,也得预备connect成功返回的情况发生。
reactor模式下的所有连接必须是非阻塞的。
与后台服务器之间的连接需要在应用层判活,因为如果对端主机突然宕机是不会发送任何消息的。
------------
socket的创建
int sockfd = ::socket(AF_INET,SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP);
阅读(1430) | 评论(0) | 转发(0) |