【问题标题】:Is it possible to attach application data to a socket?是否可以将应用程序数据附加到套接字?
【发布时间】:2013-12-10 20:10:32
【问题描述】:

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

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

澄清:

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

【问题讨论】:

  • 因为套接字是由文件描述符表示的,所以你可以只使用一种非常基本的全局查找结构。
  • 如何复用多个套接字?使用 WSAAsyncSelect()(您可以在其中将索引编码到消息中)、select()(在这种情况下您无论如何都需要线性搜索)或其他什么?

标签: c winapi winsock2


【解决方案1】:

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

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

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

【讨论】:

  • 谢谢,虽然我很难让它工作,但我花了 2 天时间来理解整个过程,主要是因为所有的例子都是:太复杂,太冗长,差解释到极致,或者遗漏了一个关键话题。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多