将Windows套接字程序移植到Unix:unix中winsock32 API的替代方案

时间:2010-06-15 04:42:33

标签: c++ unix-socket

在套接字编程中,如果连接关闭,Unix线程如何从客户端收到Socket CLOSE事件?

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

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

请提供查询帮助。

4 个答案:

答案 0 :(得分:2)

您可以在执行阅读时跟踪关闭事件。当read返回0时,套接字关闭(当然,谈论“伯克利套接字”)。

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

答案 1 :(得分:0)

很抱歉没时间回答,但请查看Beej's Guide to Network Programming

答案 2 :(得分:0)

您是否考虑过使用boost::asio,这样您至少可以共享linux&视窗。与裸套接字相比,开销并不大,您可以获得更好的语义。来自boost的代码的许多部分已经飞入标准C ++,因此代码具有相当高的质量。

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

答案 3 :(得分:0)

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