0

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

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

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

请提供查询帮助。

4

4 回答 4

2

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

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

于 2010-06-15T04:48:03.060 回答
0

抱歉没有时间回答,但请查看Beej 的网络编程指南

于 2010-06-15T04:44:13.140 回答
0

您是否考虑过使用boost::asio,这样您至少可以在 linux 和 windows 之间共享代码。与裸套接字相比,开销并没有那么大,并且您可以获得更好的语义。来自 boost 的许多代码部分已流入标准 C++,因此代码质量相当高。

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

于 2010-06-15T04:48:11.417 回答
0

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

于 2010-06-15T07:01:13.110 回答