C#中的Udp
cs
// TCP 面向长连接 面向流
// UDP 面向无连接 面向数据报 :UDP如何确定当前网络中的其客户端 广播
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any, 9009));// 一个UDP客户端
Task.Run(() =>
{
byte[] buffer = new byte[1024];
EndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
socket.ReceiveFrom(buffer, ref iPEndPoint);
Console.WriteLine(Encoding.UTF8.GetString(buffer));
// iPEndPoint 指的是哪个客户端发过来的
// 启动后,发送一个广播,接收到广播后 给发广播的人一个回应
});
// 无连接 这个消息会往这个局域网里丢
// 前面不需要连接动作
//socket.SendTo(new byte[] { 0x01, 0x02 }, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Socket对象的配置属性
socket1.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
socket1.SendTo(new byte[] { 0x01, 0x02 }, new IPEndPoint(IPAddress.Parse("255.255.255.255"), 6666));
TCP 客户端发送/接收
cs
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));
// 同步处理
{
//byte[] buffer, int offset, int size, SocketFlags socketFlags
string msg = "Hello";
byte[] data = Encoding.UTF8.GetBytes(msg);
//for (int i = 0; i < 10; i++)
{
socket.Send(data, 0, data.Length, SocketFlags.None);
}
Console.ReadLine();
发送 上位机(客户端)主动请求设备(服务器)
通信过程,一问一答 请求-》响应
开始接收响应
byte[] buffer = new byte[1024 * 1024];// 如果没有应用层协议规定
长度 ModbusTCP 请求多少个寄存器 返回的特定的长度
TCP : 面向数据流,没有明显边界 数据包中记录有效字节数 S7
Console.WriteLine("开始接收");
socket.Receive(buffer);// 1、有数据进来 不会就卡住 2、确保字节的长度
Console.WriteLine("接收完成");
//Send有没有时间间隔
// 异步-》对应哪个发送的请求
// 返回接收报文
}
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
// 异步读写
{
string msg = "Hello";
byte[] data = Encoding.UTF8.GetBytes(msg);
var result = socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ret =>
{// 异步方法,同步的处理
try
{
socket.EndSend(ret);
// 发送未完成,就开始接收响应
byte[] buffer = new byte[1024];
Console.WriteLine("开始接收");
//socket.Receive(buffer);
//while (true)// 需要必须拿到数据才往下走
{
var result = socket.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(DoAsync), socket);
bool s = result.AsyncWaitHandle.WaitOne(500);// 等待500毫秒 以内完成接收动作
if (!s)
Console.WriteLine("接收超时");
//else
// break;
autoResetEvent.Set();
}
// 耗时
// 等待一个通知
autoResetEvent.WaitOne();
// 处理
Console.WriteLine(Encoding.UTF8.GetString(buffer));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}), socket);
//result.AsyncWaitHandle.WaitOne();
Console.WriteLine("开始发送");
}