【发布时间】:2016-06-26 01:04:24
【问题描述】:
对于我的 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 套接字?
【问题讨论】:
-
UDP 是一种无连接协议。 MSDN 上哪里说要使用 connect()?我想你一定读过一些 TCP 文档......
-
connect() 确实对 UDP 做了一些事情:它设置了 UDP 套接字将向其发送数据包(并从中接收数据包)的地址。这样以后您就可以调用 send() 而不是 sendto()。不是非常有用,真的,但也不是完全没用。
-
@Tony: 不,
connect在无连接套接字上完全有效。它只是将套接字修复为仅允许从单个远程地址发送/接收(因此您可以使用send和recv而不是sendto和recvfrom)。