美文网首页
非阻塞connect和accept

非阻塞connect和accept

作者: 小怪兽狂殴奥特曼 | 来源:发表于2018-04-17 21:59 被阅读436次

1 非阻塞connect

1.1 阻塞模式与非阻塞

调用connect会发起三次连接。

阻塞模式下,connect的返回结果:

  • 发出syn分节后,对方没有收到对端的syn分节,这时会返回ETIMEOUT。超时时间大概在75秒左右。
  • 发出syn分节后,对方没有在监听指定的端口,便会回复RST。这时返回ECONNREFUSED。
  • 发出syn分节后,引发路由器一个ICMP目的不可达的错误。多次尝试后仍无法成功发送,这时会返回EHOSTUNREACH或者ENETUNREACH。

非阻塞模式下,调用connect后会立刻返回EINPROGRESS,同时三次握手还在进行。

1.2 非阻塞模式的实现

int socfd = socket();
//set non-blocking
int ret = connect(sockfd, ...);
if(ret < 0)
{
    return -1;
}
if(errno == EINPRPGRESS)
{
    fd_set rdset, wrset;
    FD_SET(sockfd, rdset);
    FD_SET(sockfd, wrset);
    ret = select(sockfd+1, &rdset, &wrset, NULL, timeout);
    if(FD_ISSET(sockfd, &wrset))
    {
        if(FD_ISSET(sockfd, rdset))
        {
            //清楚sock error
        }
        //成功连接
        return sockfd.
    }
}

1.3 非阻塞connect的意义

非阻塞connect的意义在于提高并发度。阻塞connect下,完成一个三次握手需要耗费一个RTT时间。RTT时间波动很大。从局域网内的几时毫秒到广域网的几十秒。阻塞模式下,进程被connect阻塞住,什么都干不了。非阻塞下,我们可以让select或者epoll来监听listenfd,直到完成三次连接再继续进行数据的手法。

2 非阻塞accept

2.1 非阻塞accept的实现

int sockfd = socket();
//set non-blocking
bind()
fd_set rdset;
FD_SET(sockfd, &rdset);
while(1)
{
    int ret = select(sockfd+1, &rdset, NULL, NULL, timeout);
    if(ret < 0)
    {
        // err log
    }
    if(errno == EPROTO || ...)
    {
        continue;
    }
    int accept(sockfd,...);
}

2.2 注意点

完成三次连接后,accept之前,select为可读,这个时候如果对端关闭连接,accept这个关闭的sockfd会阻塞。

所以select返回后,accept前,总是忽略EWOULDBLOCK和ECONNABORTED、EPROTO、EINTR。

2.3 非阻塞accept的意义

非阻塞accept的意义同样在于提高并发度。

相关文章

  • 非阻塞connect和accept

    1 非阻塞connect 1.1 阻塞模式与非阻塞 调用connect会发起三次连接。 阻塞模式下,connect...

  • 网络编程&&多线程编程

    非阻塞模式下,send recv connect、accept函数的情况研究 connect阻塞模式下(超时时间7...

  • socket

    socket connect阻塞和非阻塞处理 定义信号处理函数

  • IO通信模型(二)同步非阻塞模式NIO(NonBlocking

    同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的accept()和read()操...

  • BIO NIO AIO

    BIO BIO意为阻塞IO(Blocking IO),即所有的通信方法如Accept,connect,read和w...

  • gevent完成多任务(!!常用)

    recfrom() connect() accept()都是阻塞,都可以利用这段时间,切换别的任务 但是...

  • 值1000块的非阻塞CONNECT

    将套接字文件描述符设置成非阻塞之后,对于CONNECT的判定问题。用fcntl将套接字设置为非阻塞。connect...

  • 网络编程

    client:connect();send(); server:bind();listen();accept();...

  • I/O-NIO-普通

    NIO by shihang.mai SocketNIO 一个线程里,设置accept非阻塞, 然后每接收一个客户...

  • 非阻塞和阻塞

    ### 同步 任务的执行顺序和程序的执行顺序一致,所以是同步的。 ### 异步 每一个任务都有一个或多个回调函数,...

网友评论

      本文标题:非阻塞connect和accept

      本文链接:https://www.haomeiwen.com/subject/csfmkftx.html