非阻塞插座

时间:2009-10-06 11:33:08

标签: c

非阻塞套接字是我们调用fcntl()方法并将O_NONBLOCK标志与它关联的套接字。任何人都可以告诉我还有什么需要将普通的TCP_IP套接字转换为非阻塞套接字吗?

如果非阻塞套接字与Windows服务器配合使用可能会出现什么问题?

1 个答案:

答案 0 :(得分:8)

linux的示例init可能如下所示:

int flags;
s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP) // ret 5
setsockopt(s, SOL_TCP, TCP_NODELAY, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, [1], 4) 
flags = fcntl(s,F_GETFL,0);
assert(flags != -1);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
connect(s, {sa_family=AF_INET, sin_port=htons(5001), sin_addr=inet_addr("192.168.0.68")}, 16)

来自太阳的基本白皮书:

sun asych net

在Windows上使用重叠的IO套接字来获取非阻塞网络。

Look here and in MSDN how to write code with OVERLAPPED structures

在Linux上使用epoll()。

在solaris socket()上。

在未准备就绪时,请注意读取或写入套接字。 (select-output)因为您可能会收到EAGAIN错误。

优秀的跨平台库(但C ++和新的c ++标准候选者)是boost :: asio。

它使用本机系统异步方法。

boost::asio