c - send() 和 receive() 使用一个套接字?

标签 c windows sockets winapi udp

<分区>

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

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

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

遇到这种情况应该怎么办? 等待回复:(

enter image description here

最佳答案

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

如果您在AB 之间发送消息,那么来自A 的消息将具有AB 的目的地 B 将相反。这样就可以区分数据包来自哪个方向,并在网络中交叉。这个词,数据包,很重要。

UDP 消息不像典型的 POTS 电话对话,在这种情况下,双方有效地在他们之间建立了一条线路,供他们使用。 UDP 消息更像是蜗牛邮件中的字母,其中每个字母都称为一个数据包。它们可以在网络上交叉路径,这很好。

网络堆栈在 AB 处使用 5 元组来确定哪个用户空间套接字应该接收数据,不会混淆哪个目的地是特定的数据应该去。如果您确实需要等待,您的连接速度将非常低,并且一个完整的往返行程至少需要 10 毫秒,并且一个数据包几乎总是小于 2k。

关于c - send() 和 receive() 使用一个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16298684/

相关文章:

c++ - 禁用 gcc 错误参数 '<anonymous>' 包含指向未知边界数组的指针

c++ - 是否有像 docco 这样的 C/C++ 源代码文档生成器?

尝试写入文件夹时 C# Windows 服务访问被拒绝

c++ - 从控制台读取 UTF-8 字符

java - TCP Java问题

c - 为什么在 Ubuntu 上的 C 中,堆栈上的参数和局部变量有 12 个字节?

c - 将多个文件内容写入单个文件的有效方法

c++ - 需要将 MS Visual C++ 移植到 Linux G++

c - http 服务器响应(套接字)的 header 和内容之间的区别

C++ 套接字 : Enabling Promiscuous Mode in Windows