0

C# で簡単な udp チャット アプリケーションを作成しようとしています。1 時間前には動作していましたが、何が起こったのか、正確に何を変更したのか正確にはわかりません。受信メッセージをリッスンしようとすると、「無効な引数が指定されました」という例外が発生し、変数 'rcv' を指しています。コードは次のとおりです。

public partial class Form1 : Form
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, 
                                  SocketType.Dgram, 
                                   ProtocolType.Udp);
        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),
                                                                   1234);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ThreadStart(send));
            thread1.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Thread thread2 = new Thread(new ThreadStart(receive));
            thread2.Start();
        }

        private void receive()
        {
            while (true)
            {
                byte[] rcv = new byte[2048];
                int size = sock.Receive(rcv); // this is where the exception is, pointing at rcv.
                char[] chars = new char[size];

                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int length = d.GetChars(rcv, 0, size, chars, 0);
                System.String recv = new System.String(chars);

                textBox1.Text += recv.ToString();
            }
        }

        private void send()
        {
            byte[] msg = Encoding.UTF8.GetBytes(textBox1.Text);
            sock.SendTo(msg, localEndPoint);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            sock.Close();
        }
    }

正直なところ、ソケットを使用しているときにこの例外を見たことはありません。ソケットが開いていて使用されているのではないかと思ったので、閉じようとしましたが、成功しませんでした。どんなヒントでも大歓迎です。

4

1 に答える 1

0

MSDNから:

接続指向プロトコルを使用している場合は、 を呼び出しConnectてリモート ホスト接続を確立するかAccept、 を呼び出す前に着信接続を受け入れる必要がありますReceive。このメソッドは、 orメソッドReceiveで確立されたリモート ホストから到着したデータのみを読み取ります。コネクションレス プロトコルを使用している場合は、メソッドも使用できます。任意のホストから到着するデータを受信できます。ConnectAcceptReceiveFromReceiveFrom

ConnectAccept、またはReceiveFromいずれの場合も呼び出していないようです。チャット アプリケーションは (論理的に) 接続指向のプロトコルに従うため、 の前にConnectまたはを呼び出す必要があります。AcceptReceive

于 2013-07-20T01:20:35.287 に答える