0

バインド機能をチェックしていないため、有名なエラー「アドレスは既に使用されています」があります。

これが私のコードです:

memset(&(this->serv_addr), 0, sizeof(this->serv_addr));
this->serv_addr.sin_family = AF_INET;
this->serv_addr.sin_port = htons(port);
this->serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int yes = 1;
if (setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
}

しかし、コードを実行すると、次のようになりました。 setsockopt: Bad file descriptor

ガイドBeejnetからのコードは正しいです。しかし、なぜエラーが発生したのですか? コードの位置が間違っているのではないでしょうか?

sock_fd が最初に呼び出されるのは、関数 w_socket にあります。

int retv;
retv = socket(AF_INET, SOCK_STREAM, 0);
if(retv == -1)
{
    std::string err_msg(strerror(errno));
    err_msg = "[socket] " + err_msg;
    throw err_msg;
}
else
{
    int reuse_opt = 1;

    setsockopt(this->sock_fd, SOL_SOCKET, SO_REUSEADDR, &reuse_opt, sizeof(int));
    return retv;
}

}

デフォルトでは、sesockopt がありますが、チェックはありません。試してみましたが、うまくいきません。

4

1 に答える 1

0

socket次のように、最初に呼び出しを介してソケットを作成する必要があります。

sock_fd = socket(PF_INET, SOCK_STREAM, 0);

(および戻り値を確認します。詳細については、を参照man 2 socketしてください)

そうして初めて、電話をsetsockoptかけることができます。への呼び出しの前にsocketsock_fd変数にはソケット ファイル記述子の代わりにランダムな値 (または 0) が含まれます。

更新された質問の後に編集:

への呼び出しは、その時点での代わりにsetsockopt使用する必要があります。変数には、への呼び出しの結果がまだ含まれていません。retvthis->sock_fdthis->sock_fdsocket

于 2011-10-17T08:04:35.093 に答える