我一直在用C#试验UDP发送和接收,并且有一个奇怪的问题.代码在控制台应用程序中工作正常,但当我尝试在服务中使用完全相同的代码时,client.ceceive方法被阻止.服务正常运行,不会中止,我有记录写入文本文件,所以我知道它到达接收.有人有主意吗?代码如下......
public partial class Service1 : ServiceBase { private bool serviceStarted = false; Thread listenerThread; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { serviceStarted = false; WriteLog("UDPListener Service Starting"); ThreadStart thread = new ThreadStart(StartListening); listenerThread = new Thread(thread); serviceStarted = true; listenerThread.Start(); } protected override void OnStop() { WriteLog("UDPListener Service Stopping"); serviceStarted = false; listenerThread.Join(new TimeSpan(0, 0, 5)); } private void StartListening() { WriteLog("Worker thread spawned."); UdpClient client = new UdpClient(40000); while (serviceStarted) { WriteLog("Service is started. Getting endpoint."); IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 40000); WriteLog("Thread is listening..."); byte[] content = client.Receive(ref remoteIPEndPoint); WriteLog("Receive unblocked."); if (content.Length > 0) { string message = Encoding.ASCII.GetString(content); WriteLog("UDPListener Message = " + message); } } Thread.CurrentThread.Abort(); } private void WriteLog(string strMessage) { FileStream filestream = new FileStream(@"c:\temp\UDPClientLog.txt", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter streamwriter = new StreamWriter(filestream); streamwriter.BaseStream.Seek(0, SeekOrigin.End); streamwriter.WriteLine(DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString() + ": " + strMessage + "\n"); streamwriter.Flush(); streamwriter.Close(); } }
Nate.. 8
终于搞清楚了.Windows防火墙阻止了传入连接,显然该服务不允许以交互方式请求取消阻止它的权限.
终于搞清楚了.Windows防火墙阻止了传入连接,显然该服务不允许以交互方式请求取消阻止它的权限.