日期:2014-05-17  浏览次数:21063 次

Win7下Socket服务端通信异常退出
本帖最后由 zpj888 于 2012-12-29 15:22:36 编辑
socket通信时,服务端会造成程序死掉,而且是无法捕捉到的异常退出
经过数天多次测试,XP下正常,绝大部分的WIN7系统会退。
以下是写的专门用于测试该问题的小程序,一个服务端,一个客户端。
其中服务端开始后,客户端指定本机的IP地址即可,注意不要使用回环地址,测试时发现回环地址不容易退。
客户端连接200个socket,每个socket频繁收发数据,很快程序退出
开发环境:VS2010,C#,Dot Net4.0
完整程序及代码链接:http://l5.yunpan.cn/lk/QkBwwZxj6wDzT
(代码没有处理各种连接及断开的异常情况,不影响测试)

请各位帮忙看看问题所在,是不是WIN7的什么补丁要装一下?测试WIN7机装了SP1,拿360打了所有补丁,一样会退

服务端监听代码:

public class 监听线程
{
    public static int ClientCount = 0;
    private static List<服务端通信线程> list = new List<服务端通信线程>();
    private static string Ip = "";
    private static int Port = 0;

    public static void 启动监听线程(string strIp, int port)
    {
        Ip = strIp;
        Port = port;
        var th = new Thread(Run);
        th.IsBackground = true;
        th.Start();
    }

    private static void Run()
    {
        var tcpListener = new TcpListener(IPAddress.Parse(Ip), Port);
        tcpListener.Start();
        while (true)
        {
            Thread.Sleep(100);
            var tcpClient = tcpListener.AcceptTcpClient();

            var obj = new 服务端通信线程();
            obj.启动通信线程(tcpClient);
            list.Add(obj);
            ClientCount++;
        }
    }
}


服务端通信核心代码:

public class 服务端通信线程
{
    private TcpClient tcpClient = null;

    public void 启动通信线程(TcpClient tcpClient)
    {
        this.tcpClient = tcpClient;
        this.tcpClient.ReceiveTimeout = 2000;
        this.tcpClient.SendTimeout = 2000;

        var th = new Thread(Run);
        th.IsBackground = true;
        th.Start();
    }

    private int ReadByte(byte[] buffer, int offset, int size)
    {
        try
        {