您的位置:首页 > 其它

通讯中为自己的记录

2016-03-28 23:57 351 查看
最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace AsyncServer

{

// 定义 UdpState类

public class UdpState

{

public UdpClient udpClient;

public IPEndPoint ipEndPoint;

public const int BufferSize = 1024;

public byte[] buffer = new byte[BufferSize];

public int counter = 0;

}

// 异步UDP类

public class AsyncUdpSever

{

// 定义节点

private IPEndPoint ipEndPoint = null;

private IPEndPoint remoteEP = null;

// 定义UDP发送和接收

private UdpClient udpReceive = null;

private UdpClient udpSend = null;

// 定义端口

private const int listenPort = 1100;

private const int remotePort = 1101;

UdpState udpReceiveState = null;

UdpState udpSendState = null;

// 异步状态同步

private ManualResetEvent sendDone = new ManualResetEvent(false);

private ManualResetEvent receiveDone = new ManualResetEvent(false);

public AsyncUdpSever()

{

// 本机节点

ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);

// 远程节点

remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);

// 实例化

udpReceive = new UdpClient(ipEndPoint);

udpSend = new UdpClient();

// 分别实例化udpSendState、udpReceiveState

udpReceiveState = new UdpState();

udpReceiveState.udpClient = udpReceive;

udpReceiveState.ipEndPoint = ipEndPoint;

udpSendState = new UdpState();

udpSendState.udpClient = udpSend;

udpSendState.ipEndPoint = remoteEP;

}

public void ReceiveMsg()

{

Console.WriteLine("listening for messages");

while (true)

{

lock (this)

{

// 调用接收回调函数

IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);

receiveDone.WaitOne();

Thread.Sleep(100);

}

}

}

// 接收回调函数

private void ReceiveCallback(IAsyncResult iar)

{

UdpState udpReceiveState = iar.AsyncState as UdpState;

if (iar.IsCompleted)

{

Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);

string receiveString = Encoding.ASCII.GetString(receiveBytes);

Console.WriteLine("Received: {0}", receiveString);

//Thread.Sleep(100);

receiveDone.Set();

SendMsg();

}

}

// 发送函数

private void SendMsg()

{

udpSend.Connect(udpSendState.ipEndPoint);

udpSendState.udpClient = udpSend;

udpSendState.counter++;

string message = string.Format("第{0}个UDP请求处理完成!", udpSendState.counter);

Byte[] sendBytes = Encoding.Unicode.GetBytes(message);

udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);

sendDone.WaitOne();

}

// 发送回调函数

private void SendCallback(IAsyncResult iar)

{

UdpState udpState = iar.AsyncState as UdpState;

Console.WriteLine("第{0}个请求处理完毕!", udpState.counter);

Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));

sendDone.Set();

}

// 主函数

public static void Main()

{

AsyncUdpSever aus = new AsyncUdpSever();

Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));

t.Start();

Console.Read();

}

}

}

客户端代码:

using
System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace AsyncClient

{

// 定义 UdpState类

public class UdpState

{

public UdpClient udpClient = null;

public IPEndPoint ipEndPoint = null;

public const int BufferSize = 1024;

public byte[] buffer = new byte[BufferSize];

public int counter = 0;

}

// 异步UDP类

public class AsyncUdpClient

{

public static bool messageSent = false;

// Receive a message and write it to the console.

// 定义端口

private const int listenPort = 1101;

private const int remotePort = 1100;

// 定义节点

private IPEndPoint localEP = null;

private IPEndPoint remoteEP = null;

// 定义UDP发送和接收

private UdpClient udpReceive = null;

private UdpClient udpSend = null;

private UdpState udpSendState = null;

private UdpState udpReceiveState = null;

private int counter = 0;

// 异步状态同步

private ManualResetEvent sendDone = new ManualResetEvent(false);

private ManualResetEvent receiveDone = new ManualResetEvent(false);

// 定义套接字

//private Socket receiveSocket;

//private Socket sendSocket;

public AsyncUdpClient()

{

// 本机节点

localEP = new IPEndPoint(IPAddress.Any, listenPort);

// 远程节点

remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);

// 实例化

udpReceive = new UdpClient(localEP);

udpSend = new UdpClient();

// 分别实例化udpSendState、udpReceiveState

udpSendState = new UdpState();

udpSendState.ipEndPoint = remoteEP;

udpSendState.udpClient = udpSend;

udpReceiveState = new UdpState();

udpReceiveState.ipEndPoint = remoteEP;

udpReceiveState.udpClient = udpReceive;

//receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//receiveSocket.Bind(localEP);

//sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//sendSocket.Bind(remoteEP);

}

// 发送函数

public void SendMsg()

{

udpSend.Connect(remoteEP);

//Thread t = new Thread(new ThreadStart(ReceiveMessages));

//t.Start();

Byte[] sendBytes;

string message;

while (true)

{

message = "Client" + (counter++).ToString();

lock (this)

{

sendBytes = Encoding.ASCII.GetBytes(message);

udpSendState.counter = counter;

// 调用发送回调函数

udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);

sendDone.WaitOne();

Thread.Sleep(200);

ReceiveMessages();

}

}

}

// 发送回调函数

public void SendCallback(IAsyncResult iar)

{

UdpState udpState = iar.AsyncState as UdpState;

if (iar.IsCompleted)

{

Console.WriteLine("第{0}个发送完毕!", udpState.counter);

Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));

//if (udpState.counter == 10)

//{

// udpState.udpClient.Close();

//}

sendDone.Set();

}

}

// 接收函数

public void ReceiveMessages()

{

lock (this)

{

udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);

receiveDone.WaitOne();

Thread.Sleep(100);

}

}

// 接收回调函数

public void ReceiveCallback(IAsyncResult iar)

{

UdpState udpState = iar.AsyncState as UdpState;

if (iar.IsCompleted)

{

Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);

string receiveString = Encoding.Unicode.GetString(receiveBytes);

Console.WriteLine("Received: {0}", receiveString);

receiveDone.Set();

}

}

// 主函数

public static void Main()

{

AsyncUdpClient auc = new AsyncUdpClient();

auc.SendMsg();

Console.Read();

}

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: