c - 是否可以将应用程序数据附加到套接字?

标签 c winapi winsock2

我正在用 C 语言开发一个事件驱动的 Win32 套接字服务器。为了控制通信过程的几个方面,我需要在接受新连接时创建一个数据结构,但是我还没有找到了一种将应用程序的数据附加到新接受的套接字的方法,通过了解套接字,我可以有效地检索连接控制数据,因此,每次收到 FD_READ 或 FD_CLOSE 消息时,我都必须执行搜索操作,但即使搜索功能非常高效,它仍然意味着开销。

我想知道是否有一组类似于 SetWindowLongPtr/GetWindowLongPtr 的函数可以让我将应用程序的数据附加到每个新套接字,这样我就可以完全避免搜索操作。

澄清:

我并不是在寻找一种更有效的搜索方式,我正在使用的方式非常有效,我想要的是一种完全避免任何类型的搜索操作的方式(如果可能的话)。

最佳答案

为了避免每次都查找套接字数据,请切换到 I/O 完成端口:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

使用 CreateIoCompletionPort() 创建 IOCP并将每个接受的套接字与其关联,然后使用 WSASend() 执行异步套接字 I/O 操作和 WSARecv() ,它允许您在每个操作中传递自定义数据指针。为此目的定义并分配自定义struct。然后调用GetQueuedCompletionStatus()定期(例如在工作线程中),每个 IOCP 通知都会为您提供与已完成的套接字操作关联的 struct 指针。

关于c - 是否可以将应用程序数据附加到套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20504226/

相关文章:

c++ - 如何将 64 位 void 指针转换为 32 位 void 指针?

c - 如何从 C 函数中返回字符串?

c - write() 和 read() 如何在 C (<unistd.h>) 中交互?

tcp - winsock2:如果套接字已死,则 send() 失败 [不是真的]

c++ - 从 GetQueuedCompletionStatus 解除阻止

c - C中结构中的二维数组

c - 如何过滤 wchar_t 数组?

c++ - 如何在 linux 中给线程发信号?

c++ - 程序是否应该检查 "shouldn' t"但可以失败的 WinAPI 函数的失败?

c++ - 通过 winsock 发送 Direct3D 顶点信息