当前位置: 技术问答>linux和unix
一个有关服务端非阻塞socket的疑问
来源: 互联网 发布时间:2016-02-21
本文导语: 在网上看到很多有关非阻塞socket的例子。但是主要有两种不同。 一种如下(省略若干ip和端口设置的语句): fd = socket(AF_INET, SO_STREAM, 0); setnonblock(fd); bind(fd, (struct sockaddr *)&addr, 0); listen(fd, 15); client_fd = accept(fd, N...
在网上看到很多有关非阻塞socket的例子。但是主要有两种不同。
一种如下(省略若干ip和端口设置的语句):
fd = socket(AF_INET, SO_STREAM, 0);
setnonblock(fd);
bind(fd, (struct sockaddr *)&addr, 0);
listen(fd, 15);
client_fd = accept(fd, NULL, NULL);
setnonblock(client_fd);
另外一种是
fd = socket(AF_INET, SO_STREAM, 0);
bind(fd, (struct sockaddr *)&addr, 0);
listen(fd, 15);
client_fd = accept(fd, NULL, NULL);
setnonblock(client_fd);
这两种的区别很明显,前者把监听套接字也设置成为了非阻塞,而后者没有。这两种在具体的使用中有什么不同。
因为我也看到有些资料(似乎是stevens的书,具体记不太清楚了),上面说3次握手会在accept之前完成,那么accept仅仅是返回一个客户端的套接字。那么到底要不要把监听套接字设置为非阻塞的
一种如下(省略若干ip和端口设置的语句):
fd = socket(AF_INET, SO_STREAM, 0);
setnonblock(fd);
bind(fd, (struct sockaddr *)&addr, 0);
listen(fd, 15);
client_fd = accept(fd, NULL, NULL);
setnonblock(client_fd);
另外一种是
fd = socket(AF_INET, SO_STREAM, 0);
bind(fd, (struct sockaddr *)&addr, 0);
listen(fd, 15);
client_fd = accept(fd, NULL, NULL);
setnonblock(client_fd);
这两种的区别很明显,前者把监听套接字也设置成为了非阻塞,而后者没有。这两种在具体的使用中有什么不同。
因为我也看到有些资料(似乎是stevens的书,具体记不太清楚了),上面说3次握手会在accept之前完成,那么accept仅仅是返回一个客户端的套接字。那么到底要不要把监听套接字设置为非阻塞的
|
监听套接子你也可以把看成和数据传输套接字一样,只是接受到一数据是tcp建立连接的信息而已.牵扯不到3此握手,三次握手在逻辑上是更低层一点的东西.
至于要不要把它设置成非阻塞方式,那要看你程序的设计逻辑了.
至于要不要把它设置成非阻塞方式,那要看你程序的设计逻辑了.
|
看情况而定,三次握手也可能阻塞啊。
|
设置成 nonblock 是为了防止accept的等待时间太长,75秒?
如果你希望服务器仅仅注意检查是否有客户在等待连接,有就接受连接,否则就继续做其他事情,则可以通过将Socket设置为非阻塞方式来实现
如果你希望服务器仅仅注意检查是否有客户在等待连接,有就接受连接,否则就继续做其他事情,则可以通过将Socket设置为非阻塞方式来实现