2010-06-15 23 views
0

在套接字编程中,如果连接关闭,Unix线程如何从客户端接收套接字CLOSE事件?将Windows套接字程序移植到Unix:unix中winsock32 API的替代方案

是否有任何API会通知unix线程关于收到的CLOSE事件?

正如在Windows中,我们有WSAEnumNetworkEvents API,它获取指定套接字描述符的事件通知。什么是Unix套接字编程中使用的等效API?

请提供查询帮助。

回答

2

进行阅读时,可以跟踪闭合事件。当read返回0(当然是在谈论“伯克利插座”)时,插座关闭。

//编辑: 使用pollselect等待某个事件发生(数据到达,套接字关闭...)。

+0

哦,是的,我现在记得一个指导方针,'关机'写作,用'recv'读取,直到返回0,关闭另一半,关闭套接字... +1,我的回答实际上是提供一个替代(我更喜欢),但我的回答并没有回答实际问题.... – jdehaan 2010-06-15 04:51:38

0

你有没有考虑使用boost::asio,这样您可以共享至少Linux的&窗口之间的代码。与裸套接口相比,开销并不那么大,并且您有更好的语义。来自boost的许多代码部分已经被转换为标准C++,所以代码的质量相当高。

这涉及重写您的软件可能不是一个选项。另一方面,你将有一个通用的代码库来维护。

0

libevent将允许您在套接字上存在数据或需要关闭套接字时收到事件。更具体地说,您要设置套接字以在读取事件(EV_READ)和函数回调检查中通知您recv的返回值是否为0,表示另一端的套接字已完全关闭,或者-1一个错误。在第一种情况下,返回值为0时,您想要关闭套接字。在第二种情况下,返回-1表示某种“错误”,你所做的取决于错误的性质。例如,recv可能会返回-1并将errno设置为EINTR,以指示函数被中断,例如通过SIGUSR1中断。你如何处理这取决于你的应用程序需要做什么。

相关问题