網路程式設計 (十)套接字I O的超時設定示例

2021-10-04 05:43:59 字數 3488 閱讀 2759

用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兩個方向的資料流,並徹底釋放套接字 在輸入方向上,系統核心會將套接字設定為不可讀,任何讀操作都會返回異常 在輸出方向上,系統核心嘗試將傳送緩衝區的資料傳送給對端...