-
Udp 发送成功 但是接收端 没有收到数据包 是为什么? 求关注 求分析 求解答5
想要实现的是一个UDP推送功能, 实现 把本机接收到的UDP数据 直接转发到另一个Point,相当于一个传送功能。
遇到的问题:在本机测试, 使用netport抓包工具 可以看到本机把收到的数据进行了向外发送,但是接收端(另一台机子)却没有抓到相应的包(没有一次抓到,应该不是UDP丢包的问题)
测试环境:这里说的接收端既作为发送的数据源(使用UDP模拟发送器)也作为转发后的接收端 本机收到后 再转发给原来接收端; 这两台机子上的都有接收大量的UDP数据包(其他程序使用)
求关注 求分析 求解答
[size=16px][/size]
实现代码如下:
ublic partial class frmUdp : Form
{
//private UdpClient sendUdpClient;
//private UdpClient receiveUpdClient;
Socket sdsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Socket recsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
[/b]
public frmUdp()
{
InitializeComponent();
//初始化页面信息
int recePort = 4102;
int sdPort = 5001;
receivePort.Text = recePort.ToString();//接收端口
sendPort.Text = sdPort.ToString ();//发送端口
tbxPath.Text = Application.StartupPath;
}
private void button1_Click(object sender, EventArgs e)
{
// 创建接收套接字
try
{
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress receiveIp = ips[0];//与信息中心连接的Ip
//IPEndPoint receIpEndPoint = new IPEndPoint(receiveIp, int.Parse(receivePort.Text));
//receiveUpdClient = new UdpClient(receIpEndPoint);
IPEndPoint rip = new IPEndPoint(receiveIp, int.Parse(receivePort.Text));
//Socket recsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
[b]//绑定网络地址
recsock.Bind(rip);
[/b] //IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress sendIp = ips[0];//与运控连接的Ip
//IPEndPoint sendIpEndPoint = new IPEndPoint(sendIp, int.Parse(sendPort.Text));
/ndUdpClient = new UdpClient(sendIpEndPoint);
IPEndPoint sip = new IPEndPoint(sendIp, int.Parse(sendPort.Text));
//Socket sdsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
[b] //绑定网络地址
[b][/b] sdsock.Bind(sip);
//IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
Thread receiveThread = new Thread(ReceiveMessage);
//Thread createFileThread=new Thread(CreateFile);
receiveThread.Start();
//createFileThread.Start();
}
catch(Exception ex)
{
Console.Out.Write(ex);
}
}
// 接收消息方法
private void ReceiveMessage()
{
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote= (EndPoint)remoteIpEndPoint;
//IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.17"), 137);
while (true)
{
try
{
// 关闭receiveUdpClient时此时会产生异常
//byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint);
byte[] recdata = new byte[1024];
int rec = recsock.ReceiveFrom(recdata, ref remote);
byte[] receiveBytes = new byte[rec];
Buffer.BlockCopy(recdata, 0, receiveBytes, 0, rec);
//启动发送线程
Thread threadSend = new Thread(new ParameterizedThreadStart(SendMessage));
threadSend.Start(receiveBytes);
//string message = Encoding.Unicode.GetString(receiveBytes);
//List pointlist=destinationList.Rows;
//启动文件解析落地线程
//Thread saveThread = new Thread(SaveMessage);
/veThread.Start(receiveBytes);
// 显示消息内容
//ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remoteIpEndPoint, message));
}
catch(Exception e)
{
throw (e);
/;
}
}
}
//发送数据方法
private void SendMessage(object obj)
{
//IFormatter formatter = new BinaryFormatter();
//MemoryStream ms = new MemoryStream();
//formatter.Serialize(ms,obj);
//byte[] message = ms.GetBuffer();
try
{
var message = (byte[])obj;
for (int i = 0; i < destinationList.RowCount; i++)
{
if (destinationList.Rows[i] != null)
{
IPAddress remoteIp = IPAddress.Parse(destinationList[0, i].Value.ToString());
int remotePort = int.Parse(destinationList[1, i].Value.ToString());
IPEndPoint remotePoint = new IPEndPoint(remoteIp, remotePort);
//sdsock.SendTo(message, message.Length, SocketFlags.None, remotePoint);
sdsock.SendTo(message, remotePoint);
}
}
}
catch(Exception e)
{ Console.Out.Write(e); }
2013年4月09日 21:01
目前还没有答案
相关推荐
利用MATLAB建立ARP连接,轮询等待,实时接收、解析UDP数据包
在C++编程中,处理UDP数据包接收和发送是网络编程的基础。以下是对"UDP数据包接收(客户端)"这一主题的详细解释: 1. UDP协议基础: UDP是一种不可靠的协议,它不建立连接,不保证数据包的顺序,也不进行错误检测...
由于UDP的不可靠性,接收端通常需要额外的机制来确保数据的完整性和顺序,比如使用序列号对数据包进行排序,或者实现重传机制来处理丢失的数据包。 在压缩包中的"接收国电智深UDP数据包"可能是实现这一功能的具体...
然而,尽管UDP不保证数据包的顺序和完整性,但在实际应用中,为了确保通信的有效性,我们往往需要实现一种机制来确认接收端已经接收到发送端的数据,这就是所谓的“响应”机制。本文将深入讲解如何使用Qt框架来构建...
【达摩老生出品,必属精品,亲测校正,质量保证...源码说明: 基于matlab的使用UDP协议发送和接收报文程序源码,有发送和接收端两套程序,包含完整代码和注释,非常适合借鉴学习 适合人群:新手及有一定经验的开发人员
由于UDP不保证数据包的顺序和完整性,因此在接收端需要自行处理数据包的重组和错误检测。 描述中提到的“一个简单而完整的以UDP方式发送文件或单独数据包的程序”可能是一个用C++语言编写的示例程序,它利用了...
- **创建套接字**:同样,接收端也需要创建一个UDP套接字。 - **绑定地址**:接收端也要绑定一个本地IP和端口,这样数据才能被正确接收。 - **接收数据**:使用`recvfrom()`函数接收数据。这个函数会阻塞,直到有...
创建UDP接收端: 接收端同样使用`QUdpSocket`,并需要绑定到一个端口以接收数据。这里我们监听所有接口(不仅仅是本地主机)上的特定端口: ```cpp QUdpSocket udpReceiver; if (!udpReceiver.bind(QHostAddress::...
本篇文章将深入探讨如何在Java环境中实现UDP打包数据包的发送服务。 首先,我们来看`Sender.java`文件。这个文件通常包含了发送数据包的逻辑。在Java中,我们使用`java.net.DatagramSocket`类来创建UDP套接字,它...
1. **序列号与确认机制**:为每个发送的数据包分配一个唯一的序列号,这样接收端可以根据序列号对数据包进行排序,并确认收到的数据包。如果接收到的数据包序列号不连续,说明有数据包丢失,需要重新发送。 2. **重...
在实际应用中,使用这些Labview子程序时,你需要配置发送和接收端的IP地址和端口,确保它们相互匹配。同时,由于UDP的无连接特性,发送端无需等待确认,可能导致数据丢失,所以在设计系统时要考虑错误检测和重传机制...
这个"UDP例子 接收端_UDP_udp接收例子_"可能是用QT编写的一个UDP接收端程序,用于接收发送端发送的数据。 首先,我们需要创建一个UDP套接字(QDatagramSocket)来监听和接收数据。在QT中,可以通过以下代码创建一个...
在TCP中,数据会被分割成多个段,并在接收端重新组装,如果数据包丢失,TCP会进行重传。这个程序将展示如何创建一个TCP客户端和服务器,以及如何通过它们发送和接收数据。 UDP则是一种无连接的、不可靠的传输协议。...
与TCP相比,UDP不提供流控制、拥塞控制和确认机制,而是以尽可能快的速度发送数据包,对数据的顺序和丢失没有保证。这种特性使得UDP适用于实时应用,如在线视频、语音通话或在线游戏,这些场景对低延迟有较高要求,...
接收端的实现步骤如下: 1. 创建并初始化`QUdpSocket`,同样绑定到本地端口,这样可以接收来自任何源的数据报。 2. 设置信号槽连接,监听`readyRead()`信号。当有新数据到达时,该信号会被触发。 3. 在槽函数中,...
接下来是`UDPReceive.java`,这个文件展示了如何建立一个UDP接收端。与发送端类似,我们同样使用`DatagramSocket`创建一个套接字,但我们需要设置一个监听函数来捕获到来的数据包。这通常通过创建一个无限循环来实现...
Dim remoteEP As IPEndPoint = Nothing ' 接收端的IP和端口信息 Dim receivedData As String = Nothing Dim bytesReceived As Integer = udpClient.Receive(receivedBytes, remoteEP) receivedData = Encoding....
在实际应用中,发送端和接收端可能需要更复杂的逻辑,例如处理并发请求、错误检查或数据包重组。`UdpClient`类提供了丰富的API,如`BeginReceive`和`EndReceive`用于异步接收,以及`JoinMulticastGroup`用于加入多播...
UDP不保证数据的顺序、完整性和可靠性,它仅仅提供一个将数据从源端发送到目的端的机制,没有流量控制、拥塞控制和重传机制。这意味着,如果数据在网络中丢失或重复,UDP协议本身不会尝试恢复,这些责任需要由应用...
由于TCP的顺序保证,接收端可以按照正确的顺序重组RTP数据包,但这也可能导致接收端必须等待丢失的包重传,从而增加延迟。此外,TCP的拥塞控制可能导致数据流的突然减慢或暂停,这对实时应用来说可能是不利的。 **...