私の仕事は、TCPで接続された2台のコンピュータ間でプレイされる2人のプレーヤーのゲームを実装することです。必要条件の1つは、勝者だけが選択肢を再び与えられるかどうかを指定することです。サーバーが勝ち、それ以上プレイしないことを決定した場合、クライアントはサーバーとして再起動し、新しい接続を受け入れる必要があります。SO_REUSEADDRでbind()が失敗する
私のアプローチ: 、(クライアントモードでの)ゲームLOSTもし近い数sockfdと別のものを再作成します。 setsockoptを使用してSO_REUSEADDRを使用して再バインドを許可し、次にbindを呼び出します。
int yes = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
{
perror("setsockopt");
}
if (bind(sockfd, (struct sockaddr*)&svr, sizeof(svr)) == -1)
{
perror("server: bind");
}
でも、「アドレスは既に使用中です」というエラーが表示されます。私はソケットを作り直す前に150秒間スリープ状態にしましたが、この方法は機能します。
注:私は、同じPC上でこれをテストしています。リンクされた2台のPCで動作するかもしれませんが、同じPC上で動作させる必要があります。助けてください。
コード(特に 'setsockopt()'の部分)を表示してください。 –
クライアントコードでサーバー側(リスニングソケット)を再作成する前に正しく閉じていますか? Linuxシステムでは、 "netstat -tlp"は、それを受信するために開かれたTCPポートを保持しているものを特定する必要があります... – BRFennPocock
同じマシン上で同じ{address、portnum}をbind()しようとしましたか?何が起こると思いますか? – wildplasser