用select實現超時
更多網路程式設計的文章見:目錄alarm
void
handler
(int sig)
signal
(sigalrm, handler)
;alarm(5
)//設定乙個鬧鐘
int ret =
read
(fd, buf,
sizeof
(buf));
if(ret ==-1
&& errno == eintr)
else
if(ret >=0)
//問題:鬧鐘可能有其他用途,會造成衝突
套接字選項setsockopt
(sock, sol_socket, so_rcvtimeo,5)
;int ret =
read
(sock, buf,
sizeof
(buf));
if(ret ==-1
&& errno == ewouldblock)
//問題:有一些tcp不支援這些選項
select見下文read_timeout函式封裝
/**
*read_timeout 讀超時檢測函式,不含讀操作
*fd:檔案描述符
*wait_seconds:等待超時秒數,如果為0則表示不檢測超時
*成功(未超時)返回0,失敗返回-1,超時返回-1並且errno = etimedout
*/int
read_timeout
(int fd,
unsigned
int wait_seconds)
while
(ret <
0&& errno == eintr)
;//如果是有訊號引起的異常則繼續阻塞select,直到檢測到事件或則超時
if(ret ==0)
//select超時退出
else
if(ret ==1)
//select檢測到可讀事件
ret =0;
}return ret;
}
int ret;
ret =
read_timeout
(fd,5)
;if(ret ==0)
read
(fd,……)
else
if(ret ==-1
&& errno == etimedout)
timeout……
else
err_exit
("read_timeout"
);
write_timeout函式封裝/**
*write_timeout 寫超時檢測函式,不含寫操作
*fd:檔案描述符
*wait_seconds:等待超時秒數,如果為0則表示不檢測超時
*成功(未超時)返回0,失敗返回-1,超時返回-1並且errno = etimedout
*/int
write_timeout
(int fd,
unsigned
int wait_seconds)
while
(ret <
0&& errno == eintr);if
(ret ==0)
else
if(ret ==1)
ret =0;
}return ret;
}
accept_timeout函式封裝/**
*accept_timeout 帶超時的accept函式
*fd:檔案描述符
*addr 輸出引數,accept返回的對等方的位址結構
*wait_seconds:等待超時秒數,如果為0則表示正常模式
*成功(未超時)返回已連線的套接字,失敗返回-1,超時返回-1並且errno = etimedout
*/int
accept_timeout
(int fd,
struct sockaddr_in *addr,
unsigned
int wait_seconds)
while
(ret <
0&& errno == eintr);if
(ret ==-1
)// 失敗
if(ret ==0)
//select超時退出}if
(addr !=
null
)//不再阻塞
ret =
accept
(fd,
(struct sockaddr *
)addr,
&addrlen)
;else
ret =
accept
(fd,
null
,null);
if(ret ==-1
)err_exit
("accept");
return ret;
}
connect_timeout函式封裝/* activate_nonblock - 設定io為非阻塞模式
* fd: 檔案描述符
*/void
activate_nonblock
(int fd)
/* deactivate_nonblock - 設定io為阻塞模式
* fd: 檔案描述符
*/void
deactivate_nonblock
(int fd)
/** *connect_timeout - connect
*fd:套接字
*addr 要連線的對方位址
*wait_seconds:等待超時秒數,如果為0則表示正常模式
*成功(未超時)返回已連線的套接字,失敗返回-1,超時返回-1並且errno = etimedout
*/int
connect_timeout
(int fd,
struct sockaddr_in *addr,
unsigned
int wait_seconds)
while
(ret <
0&& errno == eintr);if
(ret ==0)
else
if(ret <0)
return-1
;else
if(ret ==1)
if(err ==0)
ret =0;
else}}
if(wait_seconds >0)
return ret;
}
網路程式設計 15 套接字和標準IO
1。標準io函式具有良好的移植性,這些函式都是按照ansi c標準定義的 2。標準io函式可以利用緩衝提高效能 建立套接字時作業系統會準備io緩衝,此緩衝在執行tcp協議時發揮著重要的作用。若使用標準io函式,將得到額外的另一緩衝的支援 可以看到,使用標準io函式傳輸資料時,經過兩個緩衝。例如通過f...
Unix網路程式設計 高階IO套接字設定超時
我們知道。對於乙個套接字的讀寫 read write 操作預設是堵塞的。假設當前套接字還不可讀 寫,那麼這個操作會一直堵塞下去,這樣對於乙個須要高效能的server來說,是不能接受的。所以,我們能夠在進行讀寫操作的時候能夠指定超時值,這樣就讀寫操作就不至於一直堵塞下去。在涉及套接字的i o操作上設定...
網路程式設計7 套接字關閉
close 函式 int close int sockfd close函式會對套接字引用計數減一,一旦發現套接字引用計數到0,就會關閉tcp兩個方向的資料流,並徹底釋放套接字 在輸入方向上,系統核心會將套接字設定為不可讀,任何讀操作都會返回異常 在輸出方向上,系統核心嘗試將傳送緩衝區的資料傳送給對端...