Socket中如何設定連線超時

2021-03-31 16:00:35 字數 1333 閱讀 8468

1. create socket

struct sockaddr_in addr;

addr.sin_family = af_i***;

// server address

addr.sin_addr.s_addr = i***_addr(host);

// server port

addr.sin_port = htons(port);

// creating socket

if ((soc = socket(af_i***, sock_stream, ipproto_tcp)) == invalid_socket)

throw connector_exception("connector: can't create socket");

2. connect

if (::connect(soc, (struct sockaddr *) &addr, sizeof(addr)) == socket_error)

throw connector_exception("connector: can't connect.");

3. 設定為非阻塞式socket

unsigned long ul = 1;

int ret = ioctlsocket(rec(), fionbio, (unsigned long*)&ul);

if(ret==socket_error)

log <<"ioctlsocket error" << endl;

4. select socket

fd_zero(&r_readfds);fd_zero(&r_exfds);

fd_set(rec(), &r_readfds);fd_set(rec(), &r_exfds);

if ((iret=select(0,&r_readfds, null,&r_exfds,&tv))==socket_error){

每次呼叫好select後,select 函式自動把r_readfds,r_exfds都設為空,必須重新呼叫

fd_zero(&r_readfds);fd_zero(&r_exfds);

fd_set(rec(), &r_readfds); fd_set(rec(), &r_exfds);  否則會報10022 wsaeinval 錯誤因為select如果超時會自動清空r_readfds,r_exfds。但是如果不超時,則不清空,所以要呼叫fd_zero(&r_readfds);fd_zero(&r_exfds);保證清空

5 參考文獻

Socket中如何設定連線超時

socket中如何設定連線超時 設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有一個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套...

Socket中如何設定連線超時

設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有一個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套接字進行管理 windows網路...

Socket中如何設定連線超時

設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有一個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套接字進行管理 windows網路...

Socket中如何設定連線超時

socket中如何設定連線超時 把csdn與中文yahoo翻了底朝天,也沒找到如何設定socket的連線超時的滿意方法,問此問題的兄弟已有一大堆,這裡偶就講一下win下如何設定socket的connect超時。設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有一個令人滿...

Socket中如何設定連線超時

socket中如何設定連線超時 設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有一個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套...