socket程式設計I O超時函式select封裝

2021-08-28 10:28:48 字數 2135 閱讀 7191

#include #include #include #include #include #include //使用signal函式

#include //使用wait函式

#include #include #include #include #define err_exit(m) \

do \

while(0)

/*函式只進行讀超時檢測,不進行讀操作

fd檔案描述符;wait_seconds為等待超時秒數,為0表示不檢測超時

成功(未超時)返回0,失敗返回-1,超時返回-1且errno=etimedout

*/int read_timeout(int fd, unsigned int wait_seconds)

while(ret<0 &&errno == eintr);//訊號中斷引起的失敗,需要重啟檢測

if(ret==0)//沒有檢測到事件發生,即時間超時

else if(ret == 1)

ret =0;

} return ret;

} /*

函式只進行讀超時檢測,不含寫操作

fd為檔案描述符

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

fd為套接字

addr:輸出引數,返回對方位址

wait_seconds:等待超時秒數,如果為0表示正常模式

成功(未超時)返回已連線套接字,超時返回-1並且errno = etimedout

*/int accept_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds)

while(ret<0 && errno==eintr);

if(ret == -1)

return -1;

else if(ret==0)

}//進行下方**時,ret初始為1

if(addr != null)//位址不為空

else

if(ret=-1)

err_exit("accept");

return ret;}/*

activate_nonblock —— 設定i/o為非阻塞模式

*/void activate_nonblock(int fd)

flags |= o_nonblock;//設定非阻塞模式

ret = fcntl(fd, f_setfl, flags);

if(ret == -1)

err_exit("fcntl");}/*

deactivate_nonblock —— 設定i/o為阻塞模式

*/void deactivate_nonblock(int fd)

/*connect_timeout —— connect

addr為要連線的對方位址

wait_seconds:等待超時秒數,如果為0表示正常模式

成功(未超時)返回0,超時返回-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)//發生錯誤

else if(ret==1)

if(err ==0)

ret =0;

else

} } if(wait_seconds >0)

return ret;

}

Socket程式設計 I O復用

之前基礎部分的socket流程是伺服器與客戶端之間是一對一的情形,但是,在實際情況下基本是多客戶端對一台伺服器,如何解決伺服器同時收到多個客戶端請求?基本上,這一類的需求就需要用到i o復用的技術。以下筆記詳情請參考 網路程式設計 卷一 i o復用典型使用場合 1 伺服器同時處理多個客戶套接字請求 ...

Socket程式設計函式

使用前都需載入socket動態庫 int wsastartup word wversionrequested,lpwsadata lpwsadata wversionrequested 版本,makeword 2.2 建立socket socket socket int af,int type,in...

Socket套接字程式設計(I O模型)

當上層應用呼叫recv系統呼叫時,如果對方沒有傳送資料 緩衝區沒有資料 上層應用將被linux核心阻塞 預設行為 當對方傳送了資料,linux核心套接字緩衝區有資料後,核心會把資料copy給使用者空間。然後上層應用解除阻塞,執行下一步操作。非阻塞i o 上層應用程式將套接字設定成非阻塞模式。輪詢呼叫...