之前用UdpClient,发现当开了一个端口用于监听接收,则不能再用来发送(反之亦然)。这样对于简单的收发信息来说无问题,但如果需要nat穿透的程序,则变得困难。用Socket类则不存在该问题,参考下面示例代码:
class Program
{
static void Main(string[] args)
{
SocketTest test = new SocketTest();
test.StartReceive();
Console.WriteLine("请输入对端口号,准备发送:");
string port = Console.ReadLine();
test.SendData(Encoding.UTF8.GetBytes("你好吗?"), IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
Console.ReadKey(true);
}
}
public class SocketTest
{
private Socket _socket;
IPEndPoint _local = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5238);
Thread _receiveThread = null;
public void StartReceive()
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_receiveThread = new Thread(Receive);
_receiveThread.Start();
}
public void SendData(byte[] data, IPAddress remoteIP, int remotePort)
{
_socket.SendTo(data, new IPEndPoint(remoteIP, remotePort));
}
public void Close()
{
if (_receiveThread != null)
_receiveThread.Abort();
if (_socket != null)
_socket.Close();
}
private void Receive()
{
_socket.Bind(_local);
Console.WriteLine("开始接收。。。");
while (true)
{
byte[] buffer = new byte[1024];
EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
int len = _socket.ReceiveFrom(buffer, ref remoteEP);
IPEndPoint ipEndPoint = remoteEP as IPEndPoint;
Console.WriteLine("收到消息:客户机IP--{0},,端口--{1}", ipEndPoint.Address.ToString(), ipEndPoint.Port.ToString());
Console.WriteLine("消息内容:{0}", Encoding.UTF8.GetString(buffer, 0, len));
}
}
}
转载: http://harvey8819.blog.163.com/blog/static/162365181201123121635983/
分享到:
相关推荐
通过多线程的方式实现了UDP收发数据 可以快速学习UDP通讯原理应进行实际应用
制定udp广播的端口(如果收发用同一个端口就会一直接收到自己给自己广播的消息)2.启动后向局域网广播约定的字符串(字符串包含了广播端的IP和用来接收响应的端口号)3.设备需要内置一个功能,打开约定的接收广播...
项目中需要接收对方发过来udp消息的功能,便网上找代码做了个测试发送接收UDP的简单小程序.填入对方接收ip和端口,就可以发送消息.本地绑定一个端口(代码里改),接收所有发送到该端口的消息.分为unicode,utf8,gb2312三...
C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)自己测试没有问题只是一个简单的收发消息的小程序,并没有什么测试工具。
基于C#的UDP通讯测试,默认收发都是本地IP,本地端口8000,远端端口1234,打开程序后,可向本机1234端口发送数据,也可接收本地1234端口的数据。
当然如果你非要进行连接,通过Visual C#也是可以实现的,但前提是要确定连接的远程主机的端口号处于监听状态,否则程序会出现不必要的错误,但这是种画蛇添足的做法,不仅丢失了UDP协议的无连接传送数据的特点和...
1024 如何使用PrintDocument控件打印窗体数据 599 1025 如何使用PrintPreviewContronl控件预览 599 1026 使用PrintPreviewDialog对话框 600 1027 如何使用PrintDialog对话框打印 601 1028 如何使用...
软件在线升级程序的设计 软件在线升级程序的设计 用C++Builder 6.0实现远程控制 利用C#调用Microsoft.Win32命名空间中的类实现对注册表的读取管理 用C#开发手机短信收发程序 远程计算机重启原理及实现 VC++6.0...
由于公司A和公司B是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司A的人也会对这份报价单做一些...