4

对于我的 Uni 任务,我必须创建一个快节奏的网络游戏,因此选择使用 UDP 而不是 TCP。我知道 UDP 和 TCP 编程的许多不同之处,并且通读了 MSDN 关于 winsock 的文档的大部分相关部分。在 MSDN 上,它声明通过 connect() 函数创建 UDP 套接字应该将套接字绑定到指定的地址和端口,因此能够将 send() 和 recv() 函数与创建的套接字一起使用。

对于我的应用程序,我创建了一个客户端并使用环回地址使用 connect(),该环回地址通过 send() 函数发送多个数据包。客户端在调用 select() 之后,会收到它发出的数据包。但是,我从 recv() 函数得到的结果是 SOCKET_ERROR,使用 WSAGetLastError() 的错误描述是“现有连接被远程主机强行关闭”。

如果我使用bind()函数并使用sendto()通过环回地址发送数据,我recv()数据包没有任何错误......有谁知道为什么connect()函数没有做它应该做的事情,有没有人能够使用带有 connect() 函数的 UDP 套接字?

4

4 回答 4

18

如果您希望程序接收 UDP 数据包,则需要调用 bind()。connect() 仅设置套接字在调用 send() 时将发送数据包的地址;它不会将套接字与要接收的本地 UDP 端口相关联;为此,您必须调用 bind()。

于 2010-12-20T05:08:45.197 回答
4

《UNIX 网络编程》指出,在 UDP 客户端套接字上进行的连接调用会预先计算并存储有关目标套接字地址的所有状态(屏蔽、选择接口等),从而节省每次这样做的成本。 ::发送呼叫。这本书声称 ::send 与 ::sendto 的速度可以提高 3 倍,因为这减少了开销——数据可以绕过大多数 IP 堆栈处理直接进入 NIC 驱动程序。高性能游戏程序员可能要考虑这一点。

于 2016-06-25T17:04:24.433 回答
1

您应该查看Beej's Guide to Network Programming Using Internet Sockets,有很好的示例可以解决您的问题。

于 2010-12-20T05:22:10.180 回答
-3

请记住,UDP 协议是“无连接”协议,这意味着您永远不会连接到主机,您只是发送数据。所以你可以看到connect作为一个动作对于UDP是没有意义的。

对于 UDP,您应该在这些函数中使用 sendto() 和 recvfrom(),您指定地址和缓冲区,仅此而已,在 TCP 中为您轻松处理的所有其他内容都消失了,您必须自己处理。

在 MSDN 文档中,它提到实际上您可以通过 UDP 以某种方式使用普通的发送/接收功能,但是当您已经拥有单独的功能时,您为什么还要这样做呢?就像其他已经评论过的 UDP 的 connect() 所做的其他事情一样,它本质上不是“连接”操作,而是一种为 UDP 使用设置 send()/recv() 的过滤器。

于 2013-10-14T20:25:04.593 回答