我在搜索时看到,可以在同一台计算机上使用两个不同的程序,使用相同的端口和相同的网络接口通过网络进行通信,前提是使用UDP和另一个TCP.但是我没有得到一个很好的解释,它是如何实际工作的以及为什么这是可能的?
多个程序是否也可以使用相同的UDP端口,因为UDP不会在对等体之间建立真正的连接,而只是将数据包发送到一个地址?我知道TCP不可能,因为它在服务器和客户端之间创建了一个同步连接,但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客户端程序,我能够将一个UDP数据包发送到UDP服务器,这是我的嵌入式设备,该设备回送UDP消息.
在这个PC-UDP客户端代码中,它应该得到回显的消息,但我没有得到任何回声.所以我在我的PC上运行一个UDP服务器,它监听传入的数据并打印它,我能够看到来自我的嵌入式设备的回显消息.
当我在代码中的while(1)循环之前添加这些行时,现在我能够看到Echoed返回消息.
//setup address structure
memset((char *) &si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(PORT);
si_server.sin_addr.S_un.S_addr = INADDR_ANY;
if( bind(s ,(struct sockaddr *)&si_server , sizeof(si_server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}
puts("Bind done");
Run Code Online (Sandbox Code Playgroud)
有关可能导致问题的原因的任何想法?