一个简单的udp echo server程序:
(1)没有测试是否正确,还没有编写udp echo client程序
(2)接收包的buffer大小是固定的,如果包的大小超过buffer的话,会产生异常,完美的udp程序应该捕获异常,调整buffer大小,通知重发等。
(3)不知道结束工作线程的方式是否合适,还有没有更好的方法。
/*
* Created by SharpDevelop.
* User: xuhx
* Date: 2004-6-17
* Time: 22:30
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Echo
{
///
/// this is a udp echo server. i have not test it because i does not
/// write a udp echo client. It still expects my further testing.
///
public class UdpEchoServer
{
private static Socket serverSocket;
private static Thread serverThread;
private static readonly int BUF_SIZE=2048;
public static void Main(){
IPEndPoint serverEndPoint=new IPEndPoint(IPAddress.Any,8004);
serverSocket=new Socket(AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
serverSocket.Bind(serverEndPoint);
serverThread=new Thread(new ThreadStart(EchoThreadWorkMethod));
serverThread.Start();
Console.WriteLine("the echo server has run, press \"exit\" to terminate the run"
;
while(true){
string input=Console.ReadLine();
if ( "exit"==input ) {
if (serverThread.IsAlive){
serverThread.Abort();
Console.WriteLine("thread was terminated"
;
}
Console.WriteLine("server stop"
;
serverSocket.Close();
break;
}
}
}
private static void EchoThreadWorkMethod(){
while(true){
byte[] buf=new byte[BUF_SIZE];
EndPoint remoteEndPoint=new IPEndPoint(IPAddress.Any,0);
int receive=serverSocket.ReceiveFrom(buf,SocketFlags.None,ref remoteEndPoint);
Console.WriteLine("receive from: [{0}]message is: {1}",
remoteEndPoint,
Encoding.ASCII.GetString(buf,0,receive));
serverSocket.SendTo(buf,receive,SocketFlags.None,remoteEndPoint);
}
}
}
}
|