使用Connect(),send(),recv和UDP套接字时出现问题

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

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

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

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

“UNIX网络编程”指出,在UDP客户端套接字上进行的连接调用会预先确定并存储有关目标套接字地址的所有状态(屏蔽,选择接口等),从而节省了每次执行此操作的成本。 ::发送电话。 本书声称:: send vs :: sendto可以提高3倍 ,因为这可以减少开销 – 数据可以直接通过NIC驱动程序绕过大多数IP堆栈处理。 高性能游戏程序员可能想要考虑这一点。

你应该检查Beej的网络编程指南使用互联网套接字 ,有很好的例子可以解决你的问题。

请记住,UDP协议是一种“无连接 ”协议,这意味着您永远不会连接到主机,只需发送数据即可。 所以你可以看到,连接作为一个动作对UDP来说毫无意义。

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

在MSDN文档中,它提到你实际上可以以某种方式使用UDP的普通send / recv函数,但是为什么当你有单独的函数时呢? 像其他注释已经连接()为UDP做其他事情它本质上不是一个“连接”操作,而是一种filter来设置UDP使用的send()/ recv()。