#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 上層應用程式將套接字設定成非阻塞模式。輪詢呼叫...