C# C中的线程问题

C# C中的线程问题,c#,multithreading,client,C#,Multithreading,Client,我已经用C编写了服务器/客户机程序的代码。没有使用线程,它工作得很好。如果我使用线程,我会收到以下错误消息 示例代码 客户端程序 请帮助我解决此问题。线程0x9a8已退出,代码为0 0x0。这不是一个错误。它只是告诉您后台线程已退出。零表示线程已成功运行并退出 异常出现在receiveDataobject obj中,如果出现异常,您应该能够判断出ReceiveData中的错误:远程主机强制关闭了现有连接 如果您发布正在使用的客户端程序,我可能会提供帮助。您需要找出引发套接字异常的原因。如果您阅读

我已经用C编写了服务器/客户机程序的代码。没有使用线程,它工作得很好。如果我使用线程,我会收到以下错误消息

示例代码 客户端程序
请帮助我解决此问题。

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

异常出现在receiveDataobject obj中,如果出现异常,您应该能够判断出ReceiveData中的错误:远程主机强制关闭了现有连接


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

您需要找出引发套接字异常的原因。如果您阅读了有关的文档,您将看到以下部分:

如果收到SocketException,请使用该属性获取特定的错误代码。 获取此代码后,请参阅Windows套接字 MSDN库中的版本2 API错误代码文档,用于 错误的详细描述

下面显示了如何读取错误代码:

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

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

这应该会让你去看电影


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

问题在于Main没有等待套接字完成其作业。一旦创建了线程,它就存在了。。。线程被破坏了


您需要等待套接字处理线程,方法是使用某种类型的事件,或者从Main或MyServer休眠,只要程序仅在整个作业完成时存在。

错误消息似乎在确切地告诉您出了什么问题。问一个特定的问题。实际上我要问的是如何解决这个问题…我已经清楚地解释了服务器-客户机程序在没有线程的情况下运行良好…我仍然感到困惑。您有一个日志,它准确地显示了错误所在-System.dll中发生了类型为“System.Net.Sockets.SocketException”的第一次意外异常。你的方法receiveData抛出了一个错误,然后应用程序结束了。@HenkHolterman,YavgenyP我一步一步地想出来:他用来初始化侦听器的线程在他启动的另一个线程有机会做任何事情之前结束。这不是一个真正的套接字问题,而是一个多线程问题。@YavgenyP因为他说他是C语言的新手,所以我试图展示诊断套接字错误的方法,而不是仅仅说明这一点,但是的,可能就是这样。
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();
        }
static void Main(string[] args) { TcpClient tcp = new TcpClient(); tcp.Connect("192.168.1.11", 8001); Stream stream = tcp.GetStream(); String msg = "Testing..."; byte[] content = new byte[msg.Length * sizeof(char)]; System.Buffer.BlockCopy(msg.ToCharArray(), 0, content, 0, content.Length); stream.Write(content, 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).