1

メッセージをサーバーに送信して応答を返すUDPクライアントチャットがあります。メッセージの送信用と受信用の 2 つのスレッドがあります。ReceiveFrom() メソッドで例外が発生します。「この操作を実行する前に Bind メソッドを呼び出す必要があります」。しかし、これはクライアントです。何もバインドしたくありません。たとえば、このクライアントは正常に動作します。

    byte[] data = new byte[30];
    string input, stringData;
    IPEndPoint servIPEP = new IPEndPoint(
            IPAddress.Parse("127.0.0.1"), 9050);
    EndPoint servEP = (EndPoint)servIPEP;
    Socket client = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
    string welcome = "Hello, are you there?";
    data = Encoding.ASCII.GetBytes(welcome);
    client.SendTo(data, data.Length, SocketFlags.None, servEP);
    data = new byte[30];
    int recv = client.ReceiveFrom(data, ref servEP);    //works fine!

受け取りに縛りはありません。しかし、2 つのスレッドを作成するとエラーがスローされます。

 public ChatClient()
        {
            clientSock = new Socket(AddressFamily.InterNetwork, 
                               SocketType.Dgram, ProtocolType.Udp);
            servIPEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 32000);
            servEP = (EndPoint)servIPEP;
        }

         public void ReceiveThread()
        {
            Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
            receiveThread.Start();
        }

        public void ReceiveData()
        {
           while(true){
                clientSock.ReceiveFrom(buf, ref servEP); //Here I get ERROR
                string msg = Encoding.ASCII.GetString(buf).Trim();
                Console.WriteLine("New message: {0}",msg);
                }

        }

        public void SendThread()
        { 
            Thread sendThread = new Thread(new ThreadStart(SendData));
            sendThread.Start();
        }

        public void SendData()
        {
            while (true)
            {
                Console.WriteLine("Enter message to send: ");
                string msg = Console.ReadLine();
                buf = Encoding.UTF8.GetBytes(msg);
                clientSock.SendTo(buf, servEP);
            }
        }
    }


    static void Main(string[] args)
    {

        ChatClient client = new ChatClient();
        client.SendThread();
        client.ReceiveThread();
    }
}

お時間をいただきありがとうございます。

4

1 に答える 1

2

明らかに、SendTo()は暗黙的なバインドを行い、ReceiveFrom()は行いません。

少なくとも受信するポート番号を設定するために、事前のバインドなしで受信を開始することはあまり意味がありません。それ以外の場合、どのようにデータを取得することを期待しますか?

于 2012-12-25T00:42:08.937 に答える