3

こんにちは、TCPCLient と TCPlitner を使用してデータを送信していますが、接続できないというエラーが発生しています。以下は私のコードです。

 private void button1_Click(object sender, EventArgs e)
 {
    TcpClient tcpc = new TcpClient("192.168.21.46", 10);            
    NetworkStream nts = tcpc.GetStream();
    if (nts.CanWrite)
    {
         Byte[] sends = System.Text.Encoding.ASCII.GetBytes(textBox1.Text.ToCharArray());
         nts.Write(sends, 0, sends.Length);
         nts.Flush();
    }
}

private void button2_Click(object sender, EventArgs e)
{
    TcpListener myListener = new TcpListener(10);
    myListener.Start();
    while (true)
    {
        //Accept a new connection
        Socket mySocket = myListener.AcceptSocket();
        if (mySocket.Connected)
        {                   
            //make a byte array and receive data from the client 
            Byte[] receive = new Byte[64];
            int i = mySocket.Receive(receive, receive.Length, 0);
            char[] unwanted = { ' ', ' ', ' ' };
            string rece = System.Text.Encoding.ASCII.GetString(receive);
            label1.Text = rece.TrimEnd(unwanted);                  
        }
    }
}

この 2 つのボタンは同じ形式で追加したもので、記載されている Ip apaddress は私のシステムの IP アドレスです。なぜこれが起こるのか誰か教えてください。ファイアウォールの設定も削除します。

4

2 に答える 2

0

2 つの異なるプログラムがあり、一方がリッスンし、もう一方が送信していると仮定します。そうでない場合は、それらを分離してください。ネットワークに問題があると思いますが、ブロックされている理由を正確に言えません。

ポート 10 を使用しています。これは、現在占有されていなくても、通常、任意のアプリケーションで使用するには低すぎます。カスタム プロトコルを構築している場合は、約 1000 を超えるポートでリッスンするようにしてください (経験則としてはそれ以上)。詳細については、 http://technet.microsoft.com/en-us/library/cc959828.aspxを参照するか、Google で「tcp well-known ports」を検索して、衝突が発生していないことを確認してください。

TCP リスナーを実行してみてから、コマンド プロンプトを開き、次のように入力します。

telnet localhost 10

または、10 を変更したポート番号を使用します。あなたのコードを試してみたところ、問題なくポート 10 に接続できました。「telnet」プログラムがない場合は、Windows でこの機能をオンにすることができます。(「機能」を検索し、「windows 機能をオンまたはオフにする」を選択してから、「Telnet クライアント」をオンにします)

telnet プログラムが接続する場合、問題は接続に関連していないことがわかります。telnet プログラムが接続に失敗した場合、何かがまだそのポートをブロックしていることがわかります。別のポートを試して、接続を再テストします。telnet が接続されると、プログラムの TCP クライアント部分に集中できます。

于 2013-07-31T05:34:01.723 に答える
0

まず、ボタン 2 のクリックで UI がハングします。これは、while(true) ループでスタックしているためです。非同期には BeginAcceptSocket(IAsyncResult r, Object state) を使用します。

次に、ループバック アドレスを使用する必要があります。そうしないと、ファイアウォールはポート 10 が開いていないと仮定してブロックする必要があります。また、TcpListener(int port) は廃止され、TcpListener(IPAddress localddr, int port) を使用し、両方のループバック アドレスを使用することをお勧めします。

于 2013-07-31T05:41:24.293 に答える