2

我正在写一个应用程序,但我一点也不明白。我正在尝试从特定客户端接收数据。在 TCP 套接字中,accept 返回一个fd数字,因此您可以通过该fd数字与特定客户端进行通信。

recvfrom中,任何东西都不能指定从该客户端接收数据。它从发送的每个人那里接收数据。我正在尝试解决这个问题,但我不知道该怎么做。

第二个问题是,打开一个套接字后,我打开了另一个套接字。我向客户端发送第二个套接字号,客户端在第二个套接字上发送第二个数据。在服务器端,服务器侦听第一个套接字(而不是第二个套接字)。但是,尽管客户端从第二个套接字发送数据并且服务器侦听第一个套接字,但服务器会获取数据。我将两个套接字打印为整数,并看到两个不同。服务器如何读取在第一个套接字上的第二个套接字上发送的数据?


是的,我的问题有点复杂。基本上我说:

recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr2, &size);

如何告诉特定客户(例如客户 2)在上面的行中收听?(在 TCP 套接字中,它是按fd编号完成的,但在 UDP 套接字中是如何实现的?)。

4

3 回答 3

2

接受不与 udp 一起使用。你调用socket,你调用bind来建立端口,你调用sendto和recvfrom。

恐怕我不能很好地遵循您的描述,但我希望这会有所帮助。

TCP 和 UDP 是不同且不兼容的协议。UDP 客户端和服务器相互通信,TCP 客户端和服务器相互通信。假设您可以使用 RAW 套接字与另一端的 TCP 通信,但您必须有一个完整的 TCP 协议实现。

UDP 没有连接。如果您有不同客户端的概念,则必须使用放入数据包中的数据对它们进行分类

于 2010-11-17T23:05:04.130 回答
1

如果我了解您要查找的内容,则需要将服务器上的每个套接字绑定到不同的端口号。然后客户端需要发送到所需的端口。

但是,可能没有必要这样做。服务器可以检查通过recvfrom() 调用提供的地址并将其与适当的客户端相关联并根据哪个客户端发送它来处理它(例如,通过工作线程)。

于 2010-11-17T23:23:39.427 回答
0

我认为您不能使用 UDP 与 TCP 通信。UDP 不是 TCP 的超集。它们是同一层的两种不同协议。有关更多信息,请尝试此页面

当您在计算机的同一端口上打开两个套接字时,不能保证两个套接字都会接收数据。事实上,根据我的经验,只有第一个套接字会。

于 2010-11-17T23:20:06.310 回答