使用一个socket用于send()和receive()?

时间:2013-04-30 11:22:22

标签: c windows sockets winapi udp

我开发了一个udp应用程序,其中单个服务器能够处理'x'个客户端。 在我的服务器内部,有一个主线程不断从客户端接收请求/数据,并将每个客户端的信息保存在列表中。

一旦请求来自新客户端(即来自其信息未保存在列表中的客户端),就会启动一个新线程,并创建一个单独的套接字来为该特定客户端提供服务。 换句话说,对于每个客户端,都有一个单独的套接字和一个单独的专用线程。

现在,我预见到的问题是,由于只有一个套接字即单行用于通信,因此如果服务器和客户端同时发送数据,则有可能存在数据冲突的可能性。

我该如何迎合这种情况? 等待回应:(

enter image description here

1 个答案:

答案 0 :(得分:2)

当您使用TCP或IP通过IP发送消息时,端点会跟踪所谓的5元组:源IP,目标IP,源端口,目标端口和协议(在本例中为udp)。

如果您在 A B 之间发送消息,那么来自 A 的消息的源IP将为 A 和来自 B 的目的地 B 将是相反的。通过这种方式,可以区分数据包来自哪个方向,并使数据包在网络中交叉。这个词,包,很重要。

UDP消息不像是经典的POTS电话对话,双方之间有效地连接,完全由他们使用。 UDP消息更像是蜗牛邮件中的字母,其中每个字母称为数据包。它们可以在网络上交叉路径,这很好。

网络堆栈在 A B 使用5元组来确定哪个用户空间套接字应该接收数据,没有混淆哪个目的地确定数据应该去。如果你必须等待你的连接速度将是非常低的并且完整的往返可以花费至少10秒的ms并且数据包几乎总是小于2k。