当前位置: 技术问答>linux和unix
Linux上的客户端异步通知型Socket怎么实现?
来源: 互联网 发布时间:2017-01-05
本文导语: Windows上, 提供了 WSAAsyncSelect 和WSAEventSelect, 可以让Socket有数据进来的时候, 通知程序响应, 而代码直接就过去了, 不必在此循环等待; 但在Linux上, 好像没有发现相应的函数, 而select函数, 会堵塞起来. 代码...
Windows上, 提供了 WSAAsyncSelect 和WSAEventSelect, 可以让Socket有数据进来的时候, 通知程序响应, 而代码直接就过去了, 不必在此循环等待; 但在Linux上, 好像没有发现相应的函数, 而select函数, 会堵塞起来. 代码走到这里就过不去了, 对于客户端Socket来说, 这个效果和同步/阻塞Socket也没啥区别.
我想写个Linux上客户端用的异步Socket, 当有数据来的时候通过事件/信号等方式通知程序, 而不要死等, 请问大虾们, 怎么实现呢?
另外我不想新建个线程死等数据, 这个方法我不要.
我想写个Linux上客户端用的异步Socket, 当有数据来的时候通过事件/信号等方式通知程序, 而不要死等, 请问大虾们, 怎么实现呢?
另外我不想新建个线程死等数据, 这个方法我不要.
|
Linux支持信号驱动的 I/O,内核通过 SIGIO 来通报进程,不过这样编程比较累而效率提高不多。
Linux下普遍的做法就是通过非阻塞I/O 配合 select or poll 来实现单进程(线程)多路复用。
如果非要用时间通知的方式,可以查查 SIGIO 信号。
Linux下普遍的做法就是通过非阻塞I/O 配合 select or poll 来实现单进程(线程)多路复用。
如果非要用时间通知的方式,可以查查 SIGIO 信号。
|
个人感觉poll多个文件fd的单进程多路复用已经非常效率了,多开进程并不能提高poll效率。
Unix 服务器可以支持千万级的网络并发访问量,而 Windows 的 Socket 理论最大数量是4000, 为了改变这种窘境,它才推出 IOCP 这玩意,大抵也就是把线程不再挂起去等待 I/O端口的数据返回,以提高网络程序的运行效率而已。
所以IOCP这类Windows下的机制并不适用于Linux,不过也有一些人在Linux下作了些模拟的IOCP,lz可以搜搜他们的实现。
Unix 服务器可以支持千万级的网络并发访问量,而 Windows 的 Socket 理论最大数量是4000, 为了改变这种窘境,它才推出 IOCP 这玩意,大抵也就是把线程不再挂起去等待 I/O端口的数据返回,以提高网络程序的运行效率而已。
所以IOCP这类Windows下的机制并不适用于Linux,不过也有一些人在Linux下作了些模拟的IOCP,lz可以搜搜他们的实现。