1

同じエンドポイントアドレスを定期的に構築して(再)接続できるようにしたいクライアントサーバーソケットコードがいくつかあります。localhost:17999

サーバーは次のとおりです。

// Listen for a connection:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Loopback, 17999);             
Socket listener = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Bind(localEndPoint);
listener.Listen(1);

// Accept the connection and send a message:
Socket handler = listener.Accept();
byte[] bytes = new byte[1024];
bytes = Encoding.ASCII.GetBytes("The Message...");                 
handler.Send(bytes);

// Clean up
handler.Shutdown(SocketShutdown.Both);
handler.Close();
handler.Dispose();

listener.Shutdown(SocketShutdown.Both);
listener.Close();
listener.Dispose();

そしてここにクライアントがあります:

byte[] bytes = new byte[1024];
Socket receiver = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
receiver.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
receiver.Connect(new IPEndPoint(IPAddress.Loopback, 17999));

int num_bytes_received = receiver.Receive(bytes);
string result = Encoding.ASCII.GetString(bytes, 0, num_bytes_received);

receiver.Shutdown(SocketShutdown.Both);
receiver.Close();
receiver.Dispose();

クライアントとサーバーを初めて作成するときは、正常に機能します。ただし、再度作成すると、エラーが発生します。

「ソケットが接続されておらず、(sendto呼び出しを使用してデータグラムソケットで送信する場合)アドレスが指定されていないため、データの送受信要求は許可されませんでした。」

次のイベントの順序で必要なときにいつでも、このメカニズムを任意に起動できるようにしたいと思います。

  1. サーバーを起動し、接続を受け入れるのを待ちます
  2. クライアントを起動してサーバーに接続します
  3. サーバーでクライアント接続を受け入れる
  4. クライアントにメッセージを送信する
  5. 必要に応じて繰り返す

これどうやってするの?

事前にThx!

編集:クライアントオブジェクトとサーバーオブジェクトをビルドするたびに、それは異なるプロセスからのものです。

4

2 に答える 2

3

2つの問題があります。

1)リスナーを閉じています。開いたままにしておきます。

2)ReuseAddress間違ったソケットに設定していて、遅すぎます。電話をかけるに、リスニングソケットに設定してくださいbind(アドレスを使用する場合から)。

ReuseAddress使用しないソケットに設定しbindても何も起こりません。クライアントからそれを削除することができます。

于 2013-03-06T08:22:24.370 に答える
0

Geneが提案したことを試しましたが、うまくいくようです。

// Listen for a connection:     
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Loopback, 17999);
using (Socket listener = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
{

    listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    listener.Bind(localEndPoint);
    listener.Listen(1);

    Thread t = new Thread(() =>
    {
        // Accept the connection and send a message:
        using (Socket handler = listener.Accept())
        {
            byte[] bytes = new byte[1024];
            bytes = Encoding.ASCII.GetBytes("The Message...");
            handler.Send(bytes);
        }
    });
    t.Start();
    t.Join();
}

皆さんありがとう!

于 2013-03-06T09:55:31.127 に答える