accept阻塞

一直以来以为accept阻塞的时候,若另有线程关闭相应的监听套接字,accept会立即返回。

今天先是在NDK上试,没反应。又在ARCHLINUX试了下,还是没反应。难道是我一直记的都是错的!!!!!!!!!!!!!!!!写下来,以做备忘,同时写一份非阻塞的ACCEPT

 1 int tcp_accept_timed( int fd, int msecs )
 2 {
 3     int rc, connfd;
 4     struct timeval tv;
 5     fd_set rset;
 6     struct sockaddr_in sin;
 7     socklen_t len;
 8
 9     do
10     {
11         tv.tv_sec = msecs / 1000;
12         tv.tv_usec = ( msecs % 1000 ) * 1000;
13
14         FD_ZERO( &rset );
15         FD_SET( fd, &rset );
16     }
17     while ( ( rc = select( fd + 1, &rset, NULL, NULL, &tv ) ) == -1 && errno == EINTR );
18     if ( rc < 1 )
19     {
20         if ( rc == -1 )
21         {
22             perror( "select" );
23         }
24         return -1;
25     }
26
27     len = sizeof( struct sockaddr_in );
28     memset( &sin, 0, len );
29     connfd = accept( fd, ( struct sockaddr* )&sin, &len );
30     if ( connfd == -1 )
31     {
32         perror( "accept" );
33     }
34     else
35     {
36         fprintf( stdout, "peer address ------ [%s:%d]\n", inet_ntoa( sin.sin_addr ), ntohs( sin.sin_port ) );
37     }
38
39     return connfd;
40 }
时间: 2024-10-10 12:42:05

accept阻塞的相关文章

c++之socket,阻塞模式

这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept()  接受别人来连接我,这个是个阻塞函数,一般服务器调用. recv() 接受对方发过来的消息,这个也是阻塞函数,因为TCP要等对方把消息传递完整后再执行把消息从buff里面copy过来.这个客户端和服务器都要调用,注意~!!!!! send()  发送消息 connect() 连接socket,一般是

java网络通信:同步阻塞式I/O模型(BIO)

缺点:一个线程只能处理一个客户端连接 服务端: public class TimeServer { public static void main(String[] args) throws IOException { int port = 8080; ServerSocket server = null; try { server = new ServerSocket(port); System.out.println("The time server is start in port : &

11 非阻塞套接字与IO多路复用(进阶)

1.非阻塞套接字 第一部分 基本IO模型 1.普通套接字实现的服务端的缺陷 一次只能服务一个客户端! 2.普通套接字实现的服务端的瓶颈!!! accept阻塞! 在没有新的套接字来之前,不能处理已经建立连接的套接字的请求. recv 阻塞! 在没有接受到客户端请求数据之前, 不能与其他客户端建立连接! 3.普通服务器的IO模型 第二部分 非阻塞套接字 1.非阻塞套接字与普通套接字的区别 >>> import socket >>> server = socket.sock

非阻塞套接字与IO多路复用

我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个客户端! 并且,为了使一个客户端能够不断收发消息,我们还要使用while循环来轮询,这极大地降低了我们的效率 accept阻塞! 在没有新的套接字来之前,不能处理已经建立连接的套接字的请求 recv 阻塞! 在没有接受到客户端请求数据之前,不能与其他客户端建立连接 可以用非阻塞接口来尝试解决这个问题! 阻塞IO模型 阻塞IO(blocking IO)的特点:就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被

【python之路35】网络编程之socket相关

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: fil

TCP连接和建立

TCP三次握手 第一次握手:客户端向服务器发送→SYN J(调用connect进行主动打开.表示同步,告诉服务器客户将在连接中发送的数据的初始序列号,此时connect阻塞) 第二次握手:服务器向客户端响应一个→SYN K和→ACK J+1,客户端收到后connect返回(调用accept被动打开,告诉客户端服务器将在连接中发送的数据的初始序列号,此时accept阻塞) 第三次握手:客户端向服务器发送→ACK K+1,服务器收到后accept返回. TCP四次挥手 第一次挥手:某个应用先调用cl

关于BIO和NIO的理解

最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的,能达意就行. 简介: BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善. NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮

【Python3之socket编程】

一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. 补充:也有人将socket说成ip+port,ip是用来

**.Python自学之路:网络编程

socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 1.首先来看一下简易版的客户端与服务器的搭建 客户端 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999) #测试地址与端口 sk = socket.socket() #生成句柄 sk.conne