在套接字编程中,如果连接关闭,Unix线程如何从客户端收到Socket CLOSE事件?
是否有任何API会通知unix线程收到CLOSE事件?
在Windows中,我们有WSAEnumNetworkEvents API,它获取指定套接字描述符的事件通知。什么是Unix套接字编程中使用的等效API?
请提供查询帮助。
答案 0 :(得分:2)
您可以在执行阅读时跟踪关闭事件。当read
返回0时,套接字关闭(当然,谈论“伯克利套接字”)。
//编辑:
使用poll
或select
等待某些事件发生(数据到达,套接字关闭......)。
答案 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中断。如何处理这取决于您的应用程序需要做什么。