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();
        }

クライアントプログラム

static void Main(string[] args)
{
            TcpClient tcp = 新しい TcpClient();
            tcp.Connect("192.168.1.11", 8001);
            ストリーム stream = tcp.GetStream();
            String msg = "テスト中...";
            byte[] content = new byte[msg.Length * sizeof(char)];
            System.Buffer.BlockCopy(msg.ToCharArray(), 0, content, 0, content.Length);
            stream.Write(コンテンツ、0、コンテンツ.長さ);
}

次の出力が得られます。


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

ソケット例外をスローしている理由を理解する必要があります。Socket.Receiveのドキュメントを読むと、次のセクションが表示されます。

ノート

SocketException を受け取った場合は、SocketException.ErrorCodeプロパティを使用して特定のエラー コードを取得します。このコードを取得したら、エラーの詳細な説明について、MSDN ライブラリの Windows ソケット バージョン 2 API エラー コード ドキュメントを参照してください。

そのリンクをたどると、エラー コードの読み方が示されます。

ErrorCode プロパティには、例外の原因となったエラーに関連付けられているエラー コードが含まれています。

SocketException の既定のコンストラクターは、ErrorCode プロパティを最後に発生したオペレーティング システム エラーに設定します。ソケット エラー コードの詳細については、MSDN の Windows ソケット バージョン 2 API エラー コードに関するドキュメントを参照してください。

エラー コード ページが表示されます。

提供していないエラー コードに応じて、ネットワークの問題を診断できます。

于 2012-05-25T17:45:43.280 に答える
3

「スレッド '' (0x9a8) はコード 0 (0x0) で終了しました。」エラーではありません。バックグラウンド スレッドが終了したことを示しているだけです。ゼロは、スレッドが実行され、正常に終了したことを意味します。

例外は receiveData(object obj) にあります。「受信データのエラー: 既存の接続がリモート ホストによって強制的に閉じられました」という例外を考えると、わかるはずです。

使用しているクライアント プログラムを投稿していただければ、お役に立てるかもしれません。

于 2012-05-25T17:43:25.500 に答える
2

問題は、Main() がソケットのジョブが完了するまで待機しないことです。スレッドを作成するとすぐに存在します...そしてスレッドは破棄されます。

ジョブ全体が完了したときにのみプログラムが存在する限り、なんらかのイベントを使用するか、Main() または MyServer() からスリープして、ソケット処理スレッドを待機する必要があります。

于 2012-05-25T17:58:39.063 に答える