对于我的Uni作业,我必须创建一个快速节奏的网络游戏,因此选择使用UDP而不是TCP。我知道编程UDP和TCP的许多差异,并且已经阅读了MSDN关于Winsock文档的大多数部分。在MSDN上,它指出,通过Connect()函数创建UDP套接字应将套接字绑定到指定的地址和端口,因此可以将Send()和RECV()函数与创建的套接字一起使用。

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

如果我使用bind()函数并使用sendto()通过循环返还地址发送数据,则i recv()数据包没有任何错误...有人知道为什么连接()函数不做应该做的事情,并且是否有人能够使用连接()函数使用UDP插座?

有帮助吗?

解决方案

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

其他提示

“ UNIX网络编程”指出,在UDP客户端套件上进行的连接呼叫算出,并预先存储有关目标套接字地址的所有状态(屏蔽,选择接口等),从而节省了每个状态:: sendto电话。这本书声称:: send vs :: sendto可以是 最多3倍 更快的速度由于减少的开销 - 数据可以直接绕过大多数IP堆栈处理的NIC驱动程序。高性能游戏程序员可能想考虑这一点。

您应该检查 Beej使用Internet插座的网络编程指南, ,有一些很好的例子可以解决您的问题。

请记住,UDP协议是“无连接“协议意味着您永远不会连接到主机,只需发送数据。因此,您可以看到连接作为操作对于UDP毫无意义。

对于UDP,您应该在这些函数中使用sendto()和recvfrom()指定地址和缓冲区,这是关于TCP中为您处理的其他所有内容,您必须自己处理事情。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top