簡體   English   中英

套接字超時並刪除O_NONBLOCK選項

[英]socket timeout and remove O_NONBLOCK option

我實現了一個套接字超時並重試,但是為了做到這一點,我必須將套接字設置為非阻塞套接字。 但是,我需要套接字阻止。 這是我試圖解決這兩個問題的嘗試。 這是行不通的。 隨后的發送呼叫被阻止,但從不發送任何數據。 當我在沒有選擇和超時的情況下進行連接時,后續的發送呼叫將正常工作。

參考文獻:

碼:

fd_set fdset;
struct timeval tv;
fcntl(dsock, F_SETFL, O_NONBLOCK);
tv.tv_sec = theDeviceTimeout;
tv.tv_usec = 0;
int retries=0;
logi(theLogOutput, LOG_INFO, "connecting to device socket num retrys: %i", theDeviceRetry);
for(retries=0;retries<theDeviceRetry;retries++) {
    connect(dsock, (struct sockaddr *)&daddr, sizeof daddr);


    FD_ZERO(&fdset);
    FD_SET(dsock, &fdset);
    if (select(dsock + 1, NULL, &fdset, NULL, &tv) == 1) {
        int so_error;
        socklen_t slen = sizeof so_error;
        getsockopt(dsock, SOL_SOCKET, SO_ERROR, &so_error, &slen);
        if (so_error == 0) {
            logi(theLogOutput, LOG_INFO, "connected to socket on port %i on %s", theDevicePort, theDeviceIP);
            break;
        } else {
            logi(theLogOutput, LOG_WARN, "connect to %i failed on ip %s because %s retries %i", theDevicePort, theDeviceIP, strerror(errno), retries);
            logi(theLogOutput, LOG_WARN, "failed to connect to device %s", strerror(errno));
            logi(theLogOutput, LOG_WARN, "error: %i %s", so_error, strerror(so_error));
            continue;
        }
    }
}

int opts;
opts = fcntl(dsock,F_GETFL);
logi(theLogOutput, LOG_DEBUG, "clearing nonblock option %i retries %i", opts, retries);
opts ^= O_NONBLOCK;
fcntl(dsock, F_SETFL, opts);

在獲得可寫事件並且沒有錯誤之后,您需要再次調用connect() ,如記錄所示。 這告訴您連接是成功還是失敗。

為什么不使用SO_RCVTIMEOSO_SNDTIMEO套接字選項? 還是我想念您的問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM