0

UNIX の C 言語で UDP サーバーとクライアントを作成しています。サーバー上の独自のスレッドで各クライアントを処理する必要があります。各スレッドで、対応するクライアントからのメッセージのみを受信したい。現在、recvfrom を使用してメッセージを覗いており、メッセージが「私のもの」かどうかを確認しています。

複数のソケットを同じ host:port でリッスンし、それぞれを対応するクライアントに接続して、そのクライアントからのみメッセージを受信することができると聞きました。これは、新しいクライアントに遭遇したときに実行するコードです。ただし、最初のクライアント接続後、メッセージは実際にはフィルタリングされますが、新しいソケットだけでなく、新しいクライアントをリッスンするメインソケットでもフィルタリングされるため、新しいクライアントに接続できません。

void fun(int* sockfd, struct sockaddr_in* my_addr, struct sockaddr_in* cli_addr)){
if ((*sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
    ERR("socket");
}

int optval = 1;
bzero(my_addr, sizeof (*my_addr));
my_addr->sin_family = AF_INET;
my_addr->sin_port = htons(PORT);
my_addr->sin_addr.s_addr = htonl(INADDR_ANY);

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof (optval)) < 0) {
    ERR("setsockopt");
}
if (bind(sockfd, (struct sockaddr*) my_addr, sizeof (*my_addr)) == -1) {
    ERR("bind");
}

if (connect(*socket, (struct sockaddr*) cli_addr, sizeof (*cli_addr)) < 0)
    ERR("connect");
}
}

UDP メッセージをフィルタリングするためのより良い (そして機能する) 方法はありますか?

4

1 に答える 1

1

私の意見では、データの送受信に 1 つのスレッドを使用してから、他のスレッドにディスパッチする必要があります。

複数のソケット サーバー側は必要ありません。1 つのソケットがすべてのデータグラムを受信し、ソースを抽出して処理し、ディスパッチします。

次のようなことができます。

データグラムが読み取られます:

  • ソースがわかっている場合は、それについてのバックバックを呼び出します
  • ソースが不明な場合は、新しいスレッドを作成し、このソースのコールバックを登録してください。
  • クライアントを「切断」したいときはいつでも、コールバックの登録を解除し、スレッドを削除してください。

UDPソケットが接続されていないため、「切断」とはアプリケーションにとって論理的な意味であることに注意してください。

于 2013-06-06T18:53:16.140 に答える