使用UDP套接字接收数据

时间:2010-11-17 22:36:15

标签: sockets udp client-server recv

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

recvfrom中,任何内容都无法指定从该客户端接收数据。它接收发送给每个人的数据。我想解决这个问题,但我不知道该怎么做。

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


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

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

如何告诉特定客户(比如客户2)在上面的行中收听? (在TCP套接字中,它是由fd编号完成的,但它在UDP套接字中是怎么做的?)。

3 个答案:

答案 0 :(得分:2)

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

我担心我不能很好地遵循你的描述,但我希望这会有所帮助。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我认为您不能使用UDP与TCP通信。 UDP不是TCP的超级集合。它们是同一层的两种不同协议。有关详细信息try this page

当您将两个插槽打开到计算机中的同一端口时,无法保证两个插槽都将接收数据。事实上,根据我的经验,只有第一个插座。