-1

皆さん、バックグラウンド スレッドで接続されたソケットから読み取るループを作成しようとしています。ただし、最初のメッセージしか受信しません。理由を見つけるためにしばらく検索しました。しかし、まだそれを理解することはできません。私は何人かの人々が同じ問題に遭遇したことを知っています。しかし、それらの原因は異なるようです。誰かが私を助けてくれたらいいのに。

private void setPort_Click(object sender, EventArgs e)
{
    SetupTcpListener = new Task(() =>
    {
        try
        {
            Int32 Port;
            Int32.TryParse(portNum.Text, out Port);
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            server = new TcpListener(localAddr, Port);

            server.Start(10);
            Tclient = server.AcceptTcpClient();
            Console.WriteLine("Connected");
        }
        catch (SocketException exc)
        {
            Console.WriteLine("SocketException: {0}", exc);
        }
        NetworkStream tstream = Tclient.GetStream();

        int t = 0;
        while (true)//the first loop: WriteLine a signal when read sth
        //read first message:"Get 0"
        //read second message:"Get 1"
        //and so on
        {
            t++;

            int i = 0;

            while (i <= 0)//the second loop is trying to read until get sth.
            //when it get sth, the first while loop continue,and print a "Get t"
            //t means how many times it has read a messsage.
            {
                i = tstream.Read(ReadBuffer,0,40);
            }
            Console.WriteLine("Get "+ t.ToString());
        }
    });
    SetupTcpListener.Start();
}
4

2 に答える 2

2

1 バイトしか読み取っていない理由は、次の行からわかります。

int i = 0;

while (i <= 0)
{
    i = tstream.Read(ReadBuffer,0,40);
}

NetworkStream.Read は、ソケットから読み取ったバイト数を返します。そのため、1 バイト以上を受信すると、ループから終了します。

そうは言っても、ソケットからバイトを読み取るループをどのように記述しているか (なぜここでループをネストしているのですか?)、受信したバイトの結果をどのように出力しているかなど、コードには複数の問題があります ( t を継続的に出力しているため、「0」が返されることを意味します)、特に操作が完了した後にソケットを閉じない方法です。

また、Winforms を使用している場合 (これはクリック イベントの一部であるため)、backgroundworker を使用する方がおそらく適切です。

このサイトなど、ソケットプログラミングが適切に行われる方法のいくつかの例を読むことをお勧めします。

于 2013-02-13T02:19:26.153 に答える
2

これは奇妙です:

       while (true)
        {
            t++;

            int i = 0;

            while (i <= 0)
            {
                i = tstream.Read(ReadBuffer,0,40); //now i>0 so quit the loop
            }
            Console.WriteLine("Get "+ t.ToString());
            //but go around again anyway???
        }

もしかして:

       while (true)
        {
            var amtRead = tstream.Read(ReadBuffer,0,40);

            //or even safer
            //var amtRead = tstream.Read(ReadBuffer, 0, ReadBuffer.Length);

            if(amtRead == 0)
            {
                //other end is out of data. transfer is finished
                break;
            }
        }

?

または、接続を 1 回だけ受け入れるということかもしれません。

ReadBufferまたは、配列の 0 ~ 39 の位置をデータで何もせずに永久に上書きしていることが原因かもしれません。

それはすべて、「メッセージ」が何を意味するかによって異なります。

于 2013-02-13T02:19:38.710 に答える