有UDP点对点通信的简单例子嘛?
最好有注释的,只要实现最简单的点对点发送和接受数据的功能就OK了,我想学习下~ 要C#的
最好有注释的,只要实现最简单的点对点发送和接受数据的功能就OK了,我想学习下~ 要C#的
解决方案 »
- thread.Suspend()和thread.Resume()已过时,请问用什么来代替他们比较好?求详解!
- 请问C#中 16进制数如何表示?
- 一个关于web config的问题 或resx
- C#.net下文件操作,读文件区分符号。求教
- 在网页中显示特殊字符,我在前面输入了word中的特殊字符如P•S•A的,在网页中显示P?S?A,如何处理阿??下午都在,解决了马上50分。
- 寻求网站建设方案
- Knight94(愚翁)请进!!!
- 在线等!高手们帮忙呀!
- 关于DataGrid中特色又实用的JS
- 对话框显示文本
- [C# - WinForms] 点击系统托盘的图标弹出 ContextMenuScript , 却不能自动隐藏
- Head First C# 这本书有中文版没有?
{ //private static Socket ServerSocketSender;
private static int ServerUDPPortSend = 6790; //
private static Socket ServerSocketReceiver;
private static AsyncCallback UDPReceiveCallback; //udp回调函数
private static byte[] dataBuffers; //udp字节缓存
private static EndPoint ServerEndPoint;
private static IPAddress svrIPAddress; public static IPAddress ServerIPAddress
{
get { return UDPSocketService.svrIPAddress; }
set { UDPSocketService.svrIPAddress = value; }
}
private static int svrUDPPortReceive = 9051; // internal static int ServerUDPPortReceive
{
get { return UDPSocketService.svrUDPPortReceive; }
set { UDPSocketService.svrUDPPortReceive = value; }
}
///// <summary>
///// 取安装本软件的服务器ip
///// </summary>
///// <returns></returns>
//public static IPAddress GetLocalIP()
//{
// IPHostEntry iphostentry = Dns.GetHostByName(Dns.GetHostName());
// IPAddress HostIP = null;
// if (iphostentry.AddressList.Length > 0)
// { HostIP = iphostentry.AddressList[0]; }
// return HostIP;
//}
public static void UDPDataSend(byte[] data)
{
try
{ Socket ServerSocketSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iepBroadcast = new IPEndPoint(IPAddress.Broadcast, ServerUDPPortSend);//255.255.255.255 ServerSocketSender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
ServerSocketSender.SendTo(data, iepBroadcast); //An operation was attempted on something that is not a socket
ServerSocketSender.Close();
}
catch (Exception se)
{
BizLogic.LogWriter.AddSystemException(se);
} }
public static void UDPDataSendTo(byte[] data, string IPAdd)
{
try
{
if (string.IsNullOrEmpty (IPAdd) == true || IPAdd == "N/A")
{ return; }
Socket ServerSocketSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iepBroadcast = new IPEndPoint(IPAddress.Parse(IPAdd), ServerUDPPortSend);//255.255.255.255 ServerSocketSender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
ServerSocketSender.SendTo(data, iepBroadcast);
ServerSocketSender.Close();
}
catch (Exception se)
{
BizLogic.LogWriter.AddSystemException(se);
} } /// <summary>
/// 后台监听接收
/// </summary>
public static void UDPOnListen()
{
try
{
dataBuffers = new byte[2048];
//svrIPAddress = GetLocalIP();
//System.Windows.Forms.MessageBox.Show(svrIPAddress.ToString(), svrUDPPortReceive.ToString()); ServerEndPoint = new IPEndPoint(svrIPAddress, svrUDPPortReceive); UDPReceiveCallback = new AsyncCallback(UDPDataReceived); ServerSocketReceiver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ServerSocketReceiver.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
//ServerSocketReceiver.Bind(ServerEndPoint);//不允许运行第二个该下载工具,在这会报异常
try
{
ServerSocketReceiver.Bind(ServerEndPoint);//不允许运行第二个该下载工具,在这会报异常
}
catch (System.Net.Sockets.SocketException ex)
{
if (ex.SocketErrorCode == System.Net.Sockets.SocketError.AddressAlreadyInUse)
{
System.Windows.Forms.MessageBox.Show("监听端口已被其他程序占用,不能正确获得在线播放器信息,请退出程序?",
"端口占用错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
}
throw ex; } ServerSocketReceiver.ReceiveTimeout = 5;
ServerSocketReceiver.ReceiveBufferSize = 2048; ServerSocketReceiver.BeginReceiveFrom(dataBuffers, 0, dataBuffers.Length, SocketFlags.None,
ref ServerEndPoint, UDPReceiveCallback, ServerSocketReceiver);
}
catch (Exception ex)
{
BizLogic.LogWriter.AddSystemException(ex);
} }
/// <summary>
/// UDP回调
/// </summary>
/// <param name="ar"></param>
private static void UDPDataReceived(IAsyncResult ar)
{
try
{
Socket udpSocket = ar.AsyncState as Socket;
//070128 退出时异常:由于线程退出或应用程序请求,已放弃 I/O 操作
int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)ServerEndPoint);
//当收到数据后,数据已在dataBuffers,把dataBuffers转换成可识别的结构体,依据命令类型Type //接收到的package是来自哪个ipaddress,把dataBuffers,ipaddress传过去,在第一次刷新时显示
BizLogic.DataProcessor.DataFilter(dataBuffers);
System.Threading.Thread.Sleep(5);
ServerSocketReceiver.BeginReceiveFrom(dataBuffers, 0, dataBuffers.Length, SocketFlags.None,
ref ServerEndPoint, UDPReceiveCallback, ServerSocketReceiver);
}
catch (Exception ex)
{
BizLogic.LogWriter.AddSystemException(ex);
}
}
public static bool IsUDPConnected()
{
if (ServerSocketReceiver.Connected == true)//判断UDP接受的状态
{
return true;
}
else
{
return false;
}
}
public static void Close()
{
if (ServerSocketReceiver == null)
return;
if (ServerSocketReceiver.Connected == true)
{ ServerSocketReceiver.Close(); }
}
}
通用的,客户端和服务端的监听端口互换一下就可以了,用时直接UDPSocketService.去调启动 ////启动UDP套接字监听----20080408 UDPSocketService.ServerIPAddress = startip;
UDPSocketService.ServerUDPPortReceive = startport;
UDPSocketService.UDPOnListen(); 关闭
UDPSocketService.Close();点对点发送
UDPSocketService.UDPDataSendTo(你的数据,目的地)收包要另写一个静态方法
// BizLogic.DataProcessor.DataFilter(dataBuffers);