0

我已经用 C# 编写了服务器/客户端程序的代码。不使用Thread,它工作正常。如果我使用Thread,我会收到以下error消息。

The thread '' (0x9a8) has exited with code 0 (0x0).

示例代码


public class MyServer{
    public MyServer (){
    ...
    ...
    System.Threading.Thread socThread = new System.Threading.Thread(new System.Threading.ThreadStart(receiveSockets));
    socThread.Start();
}

        private void receiveSockets()
        {
            try
            {
                while(true){
                IPAddress ipadd = IPAddress.Parse(systemIPAddress);
                TcpListener tcp = new TcpListener(ipadd, 8001);
                tcp.Start();
                Console.WriteLine("Waiting for client in 8001 port no");
                Socket socket = tcp.AcceptSocket();
                Console.WriteLine("Client address : " + socket.RemoteEndPoint);
                System.Threading.Thread socThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(receiveData));
                socThread.Start(socket);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error in receive Sockets : " + e.Message);
            }
        }

        private void receiveData(object obj)
        {
            try
            {
                while(true){
                Socket socket = (Socket)obj;
                byte[] data = new byte[1000];
                int status = socket.Receive(data);
                Console.WriteLine("Received 1.");
                string content = Encoding.UTF8.GetString(data, 0, 1000);
                Console.WriteLine("Received data 1 : " + content);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error in receive Data : " + e.Message);
            }
        }
        static void Main(string[] args){
            MyServer server = new MyServer();
        }

客户计划

静态无效主要(字符串 [] 参数)
{
            TcpClient tcp = new TcpClient();
            tcp.Connect("192.168.1.11", 8001);
            流流 = tcp.GetStream();
            String msg = "正在测试...";
            字节[] 内容 = 新字节[msg.Length * sizeof(char)];
            System.Buffer.BlockCopy(msg.ToCharArray(), 0, content, 0, content.Length);
            stream.Write(内容, 0, content.Length);
}

我得到以下输出。


IP Addrress : 192.168.1.11
Waiting for client in 8001 port no
Client address : 192.168.1.11:50140
The thread '' (0x9a8) has exited with code 0 (0x0).
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
The thread '' (0x1760) has exited with code 0 (0x0).
Error in receive Data : An existing connection was forcibly closed by the remote host
The program '[1396] Window_Server.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

请帮我解决这个问题。

4

3 回答 3

3

“线程 '' (0x9a8) 已退出,代码为 0 (0x0)。” 不是错误。它只是告诉您后台线程已退出。零表示线程成功运行并退出。

异常出现在 receiveData(object obj) 中,因为您应该能够知道,给出异常“接收数据错误:现有连接被远程主机强行关闭”。

如果您发布您正在使用的客户端程序,我可能会提供帮助。

于 2012-05-25T17:43:25.500 回答
3

您需要弄清楚为什么要抛出套接字异常。如果您阅读Socket.Receive的文档,您会看到以下部分:

笔记

如果您收到 SocketException,请使用SocketException.ErrorCode属性来获取特定的错误代码。获取此代码后,请参阅 MSDN 库中的 Windows Sockets version 2 API 错误代码文档,了解错误的详细说明。

跟随该链接向您展示如何阅读错误代码:

ErrorCode 属性包含与导致异常的错误相关联的错误代码。

SocketException 的默认构造函数将 ErrorCode 属性设置为最后发生的操作系统错误。有关套接字错误代码的详细信息,请参阅 MSDN 中的 Windows 套接字版本 2 API 错误代码文档。

哪个应该带您进入错误代码页面

现在,根据您未提供的错误代码,您可以诊断网络问题。

于 2012-05-25T17:45:43.280 回答
2

问题是 Main() 不会等待套接字完成其工作。一旦它创建了线程,它就存在了......并且线程被销毁了。

只要程序仅在整个工作完成时才存在,您就需要通过使用某种事件或睡眠,从 Main() 或 MyServer() 等待套接字处理线程。

于 2012-05-25T17:58:39.063 回答