操作が進行中です。connect(関数) エラーです。質問する

操作が進行中です。connect(関数) エラーです。質問する

関数接続のタイムアウト値を設定したいのですが、「操作が進行中です」というエラーが表示されます。

私のコード:

if ((he = gethostbyname(authdefhost)) == NULL) {
        snprintf(errbuf, CERRBUFSIZ - 1, "cannot resolve %s: %s\n", authdefhost, hstrerror(h_errno));
        return -1;
}

sin.sin_family = AF_INET;
memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr));       

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        snprintf(errbuf, CERRBUFSIZ - 1, "cannot create client socket: %s\n", strerror(errno));
        return -1;
}

if ((fcntl(sd, F_SETFL, O_NONBLOCK) < 0))
    printf("error on setting socket flags.");

if (connect(sd, (void *) & sin, sizeof(sin)) == -1) {
        snprintf(errbuf, CERRBUFSIZ - 1, "cannot connect to server %s: %s\n", authdefhost, strerror(errno));
        close(sd);
        return -1;
}

FD_ZERO(&fdset);
FD_SET(sd, &fdset);
int rv;
if ((rv = select(sd + 1, NULL, &fdset, NULL, &tv)) == -1) {
    printf("error occurred on select function.");
    return -1;
}
else if (rv == 0) {
    printf("time out occurred.");
    return -1;
}
else {
    printf("connection established");
    return sd;
}

ベストアンサー1

非ブロッキング ソケットを呼び出すとconnect()、接続ハンドシェイクが完了するまでブロッキングせずに待機することになります。その後、書き込み可能かどうかを調べ、ソケット エラーをチェックして接続が完了したかどうかを確認するEINPROGRESS必要があります。select()

Linuxのconnect()マニュアルページ:

進捗状況

    ソケットは非ブロッキングであり、接続を完了できません
    すぐに選択(2)またはpoll(2)で完了を確認することができます。
    書き込み用のソケットを選択する。select(2)が示す後
    書き込み可能、​​SO_ERRORオプションをレベル1で読み取るにはgetsockopt(2)を使用する
    connect() が正常に完了したかどうかを判断するための SOL_SOCKET
    (SO_ERRORはゼロ)または失敗(SO_ERRORは通常の
    ここにリストされているエラー コードには、失敗の理由が説明されています。

おすすめ記事