Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在同一端口上进行UDP发送和接收?_C++_Sockets - Fatal编程技术网

C++ 如何在同一端口上进行UDP发送和接收?

C++ 如何在同一端口上进行UDP发送和接收?,c++,sockets,C++,Sockets,我需要能够在同一端口上发送和接收UDP数据包。 我可以监听,比如说5000端口,但是我的发送使用了一个随机的高端口。 我正在用VB编写的系统就是这样做的,我需要编写一个UDP响应程序来调试各种协议问题 我使用了(Anders Hedstrom)的开源C++套接字库,并且已经能够使用UpSoCut::bDUE()使用虚拟函数UpSoCulto::OnRAWDATA()来接收传入的UDP包,但是已经不能导致UpSoCuS:::()(调用Connect)使UdPCSoC:::Sead()使用在Bin(

我需要能够在同一端口上发送和接收UDP数据包。 我可以监听,比如说5000端口,但是我的发送使用了一个随机的高端口。 我正在用VB编写的系统就是这样做的,我需要编写一个UDP响应程序来调试各种协议问题

我使用了(Anders Hedstrom)的开源C++套接字库,并且已经能够使用UpSoCut::bDUE()使用虚拟函数UpSoCulto::OnRAWDATA()来接收传入的UDP包,但是已经不能导致UpSoCuS:::()(调用Connect)使UdPCSoC:::Sead()使用在Bin()中选择的端口()(它改为使用随机高数端口)

移动Open()函数没有任何帮助。我已经在他们的论坛上发布了一个请求,但从我所读到的内容来看,我相信应该可以做到这一点,而且我可能不了解如何使用UDP

有人对我应该尝试什么有什么想法吗?

--谢谢--

双向通信链路始终涉及两个参与者:服务器端和客户端

客户机希望通过定义的端口与服务器通信:这就是为什么在服务器端必须将bind()绑定到套接字的原因

在客户端,必须向服务器打开一个套接字:选择哪个套接字并不重要(除非它是免费的)

换句话说,不要试图在客户端指定套接字:网络协议栈将把它分配给您的客户端


系统由多个节点组成 在同一端口(不同ip)上侦听 地址)。系统[A]将数据报发送到 系统[B]。系统[B]异步 响应并将数据报发送回 [A] 都使用相同的端口。即使[B] 标识[A]的端口,[A]不是 在那个港口听

我不确定我是否理解那句话中的“都使用同一端口”短语。如果A向B发送数据报,B将立即知道A的IP和端口(快速查看您的库文档,发现OnRawData有一个
struct sockaddr*sa
参数,如果您在*中将其强制转换为
sockaddr\u,您将能够提取IP:port对)。您可以使用该IP:port向发送数据报,a将接收数据报。a在该端口上没有调用listen,因此a没有“侦听”(),但由于A拥有绑定到该端口的套接字(无论是通过显式调用bind()还是通过OS分配的随机端口),它将接收数据

现在,如果您希望节点之间的所有通信都通过固定端口进行,您可以这样做。您只需通过“侦听”套接字发送所有数据报。如果每个节点都“侦听”在同一个端口上,这意味着每个节点都拥有一个绑定到该端口的套接字。如果您希望从a发送到B的数据报显示来自该固定端口,则必须通过该套接字发送。我猜这就是bind()的原因不适用于您的发送套接字-A将一个套接字绑定到端口X,然后您创建另一个套接字并尝试将其绑定到同一端口X,bind()失败,因为端口已被占用(并且您没有检查错误:),然后操作系统将随机空闲端口分配到1024以上

注1:我在任何地方都使用引号“侦听”,因为在UDP套接字的上下文中,这个概念不是很清楚。一旦创建了套接字并将其绑定到端口,可以显式调用bind(),也可以通过发送数据并让操作系统将其绑定到端口,就可以通过它从任何地方接收数据。No listen()或accept()需要打电话

注意2:您说UdpSocket::Open()调用connect(),但这没有多大意义-connect()对UDP套接字的作用很小-它只建立一个默认地址,这样您就可以使用send()而不是sendto(),而不是在每次发送时指定地址

希望能把事情弄清楚。

编辑以回应OP的评论:我从未使用过这个库,但根据它们的不同,Bind()方法有4个重载,每个重载都以某种方式接受端口。它们都不适用于您?

您是在同一个UdpSocket对象或两个不同的对象上调用Bind()和Open()?调用Bind(),然后打开(),然后发送()使用相同的实例化对象。系统由多个节点组成,这些节点侦听同一端口(不同的ip地址)。系统[a]向系统[B]发送数据报。系统[B]异步响应并将数据报发送回[a],所有这些都使用相同的端口。即使[B]标识[a]的端口,[a]我正在开发一个用于诊断和测试的协议测试/响应程序,必须能够显示为一个子系统,从同一个端口监听和发送。我无法更改现有系统,这些系统都是现有标准化实现的一部分。你能画一张图吗?这样会使事情更简单(至少对我来说是这样)。感谢您的回复。之前的尝试表明您的注释是正确的。更多研究表明,我必须将传递给低级bind()函数的低级结构sockaddr*address的sin_port字段从“0”更改为所需的源端口(“0”表示使用可用端口作为src进行发送)。我正在逐步检查代码,尚未找到使用高级UpdSocket对象访问和更改此内容的方法。我还不确定是否正确,并希望库有办法做到这一点。重新检查了UpdSocket::Bind()虽然都是指设置传入/接收,但第四版使用了SocketAddress&struct,它可能也有发送端口。我将更深入地研究它,并继续讨论。再次感谢您的快速响应。