UDP发送数据测试

一个合作伙伴说UDP发送数据,A(IP:192.168.1.100 子网掩码255.255.255.0)网段能发数据到B网段,但B(IP:192.168.2.100 子网掩码255.255.255.0)网段不能发数据到A网段,说法是跨路由的情况下,数据只能从下层住上层发,而不能由上层住下层发。我觉得两个网段的地位应该是相等的,即使跨路由的情况下,也应该有路由映射可以让这两个网段相互可以ping通,而只要两个网段可以ping通,就可以用upd发送数据 (当然,我们说的前提都是在一个公司的局域网内),而发送数据应该没有什么上层网段和下层网段这个玄乎的概念了吧!(哎,网络不懂害死人呀!),于是,这个测试程序就产生了,目的就是看看在任意两个可以ping通的网段里是否可以收发数据。

源码如下:

namespace Clint2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请设置IP地址:");
            string ip = Console.ReadLine();
            UDPTest udpTest = new UDPTest(ip);
        
            Console.WriteLine("请输入要发送的数据");
            string key = Console.ReadLine();
            while (key != "ok")
            {
                udpTest.AddQueue(key);
                Console.WriteLine("请输入要发送的数据");
                key = Console.ReadLine();
            }
            udpTest.StopSend();
        }

}

public class UDPTest
    {

Queue<string> _queue = new Queue<string>();
        UdpClient clintReceive = new UdpClient(8801); //接收
        UdpClient clintSend = new UdpClient();  //发送
        IPEndPoint romoteIP;
        bool _isStartSend;
        Thread threadSend;

public UDPTest(string ip)
        {
            romoteIP = new IPEndPoint(IPAddress.Parse(ip), 8801);

//启动发送线程
            _isStartSend = true;
            threadSend = new Thread(new ThreadStart(Send));
            threadSend.IsBackground = true;
            threadSend.Start();

//开始接收数据
            Receive();
        }

public void StopSend()
        {
            _isStartSend = false;

clintReceive.Close();
            clintSend.Close();
        }

public void Receive()
        {
            clintReceive.BeginReceive(ReceiveCallback, clintReceive);
        }
        public void ReceiveCallback(IAsyncResult ar)
        {
            IPEndPoint tmpRomeIP = null;
            UdpClient cr = ar.AsyncState as UdpClient;
            byte[] receiveData = cr.EndReceive(ar, ref tmpRomeIP);

string str = Encoding.ASCII.GetString(receiveData);
            Console.WriteLine(str + " from IP: " + tmpRomeIP.Address.ToString() +
                " port: " + tmpRomeIP.Port.ToString()
               );

Receive();
        }

public void Send()
        {
            clintSend.Connect(romoteIP);
            while (_isStartSend)
            {
                while (_queue.Count > 0 && _isStartSend)
                {
                    string strValue = DeQueue();
                    byte[] sendData = Encoding.ASCII.GetBytes(strValue);

//clintSend.Send(sendData, sendData.Length, romoteIP);
                   
                    clintSend.BeginSend(sendData, sendData.Length, SendCallback, clintSend);
                }
                Thread.Sleep(500);
            }
        }
        public void SendCallback(IAsyncResult ar)
        {          
            UdpClient cr = ar.AsyncState as UdpClient;
            cr.EndSend(ar);
        }

public void AddQueue(string str)
        {
            lock (this)
            {
                _queue.Enqueue(str);
            }
        }
        public string DeQueue()
        {
            lock (this)
            {
                return _queue.Dequeue();
            }
        }

}
}

时间: 2024-08-10 00:05:35

UDP发送数据测试的相关文章

UDP发送端&amp;UDP接收端

UDP发送端: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UdpSendDemo { public static void main

VM虚拟机虚拟网卡对于UDP发送广播包的影响

近期做一个项目需要用到UDP发送广播包给嵌入式端的程序并要求其作出相应的反馈,一开始非常顺利.但到了测试通用性的阶段发现有的电脑无法发送出UDP广播包,进而也就是无法跟嵌入式端交互(发现并将问题锁定在此就已经花费了非常非常非常多的心血!其中可以ping通嵌入式端这点让人纠结了很久).在问题锁定了之后第一个怀疑的是防火墙,然后是杀毒软件等等,将电脑裸奔满怀希望开启软件之后依然是那副尿性.最后百无聊赖百度了下,在一篇博客的一小段中提到了VM虚拟机的虚拟网络对于UDP发送广播包有影响,突然之间恍然大悟

通过 UDP 发送数据的简单范例

package j2se.core.net.udp; import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.util.Scanner; /** * 通过 UDP 发送数据的简单范例 */public class Sender { public static void main(Str

关于提高UDP发送效率的方法

UDP的发送效率和什么因素有关呢? 直观认为,UDP的切包长越大,应该发送效率越高(最长为65536).但是根据实际测试和在网上查到的资料的结果,包长度为1024为发送效率最高. 这种结果让人感到疑惑,为什么是1024这种奇怪的值呢?为什么不是MTU(最小发送单元)的长度(即1500-28)呢? 后来调查发现,Windows的网络底层,默认UDP分片长度为1024时,走的是快速通道模式,具体怎样的快速通道?没有再继续深入研究. 通过修改下面的注册表可以加大1024. HKEY_LOCAL_MAC

xcode中的udp发送文件函数,分包发送每包8000个字节

-(void) UDP_SendFile:(NSString *) filename; { NSString * filepath=[NSTemporaryDirectory() stringByAppendingString:filename]; NSData * sdata=[[NSData alloc] initWithContentsOfFile:filepath]; Byte *sarr; int sumpak,curpak; //分包发送 int total=sdata.length

Java基础&mdash;socket编程&mdash;UDP发送及接收

简介:在同一主机上测试,同一IP地址,不同的端口,使用UDP发收数据 使用socket编程,通过UDP协议发送数据 需求:使用UDP协议向某IP的某端口发送一条数据 UdpSend.java package com.Train; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.ne

TCP UDP发送缓冲

注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里 TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除. UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除.因此它不需要一个发送缓冲区. 在阻塞模式下, send函数的过

Linux系统下UDP发送和接收广播

// 发送端   02.#include 03.#include 04.#include<sys/socket.h>05.#include 06.#include<sys/types.h>07.#include 08.#include<netinet/in.h>09.#include<arpa/inet.h>10.#include 11.   12.   13.using namespace std;   14.   15.int main()   16.{

UDP 发送与接收数据

//UDP 发送端 package liu.net.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Send2 { public