using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;namespace rsyncty
{
    public partial class Form1 : Form
    {
        Socket serverSocket;
        Thread thread;
        public Form1()
        {
            InitializeComponent();
        }        private void Listen_Click(object sender, EventArgs e)
        {
                thread = new Thread(new ThreadStart(BeginListen));
                thread.Start();
        }
        private static IPAddress GetServerIP()
        {
            IPHostEntry ieh = Dns.GetHostByName(Dns.GetHostName());
            return ieh.AddressList[0];
        }
        private void BeginListen()
        {
            IPAddress ServerIP = GetServerIP();
            IPEndPoint iep = new IPEndPoint(ServerIP, 8000);
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);
            byte[] byteMessage = new byte[100];
            serverSocket.Bind(iep);
            while (true)
            {
                try
                {
                    serverSocket.Listen(5);
                    Socket newSocket = serverSocket.Accept();
                    newSocket.Receive(byteMessage);
                    string msg = newSocket.RemoteEndPoint.ToString() + Encoding.Default.GetString(byteMessage);
                    txtMessage.Text += msg;
                }
                catch (SocketException ee)
                {
                    //label1.Text = "error!!";
                }
            }
        }
    }
}

解决方案 »

  1.   

    你是在主線程上使用阻塞模式sockets,會阻塞當前的UI線程,當然窗口沒反應,你可以開啟一個新的工作者線程來偵聽,就不會阻塞UI界面了。
      

  2.   

    程序逻辑无误
    死机可能原因:
    Socket使用ProtocolType.Udp协议类型时要SocketType.Dgram
    其次vs2005不支持子线程调用UI线程,所以txtMessage.Text += msg; 会报错。
      

  3.   

    俺做了一个局域网QQ,源码公开,适合网络编程爱好者参考。http://www.cnblogs.com/tuyile006/archive/2006/12/30/607823.html
      

  4.   

    四樓所述為實,
    另外Udp不需要listen的!!這段代碼你可以把把ProtocolType.Udp改成ProtocolType.Tcp。txtMessage.Text += msg; 
    --------------------
    這行代碼要利用委托實現,必須在創建控件的線程訪問控件。