在linux/unix 下,有下面這五種i/o 操作方式:
1.阻塞 i/o
2. 非阻塞 i/o
3.i/o 多路復用
4.訊號驅動 i/o(sigio)
5.非同步 i/o
這篇要介紹下i/o多路復用,重要的函式:
1.select()
#include
#include
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);
引數maxfd是需要監視的最大的檔案描述符值+1;
rdset,wrset,exset分別對應於需要檢測的可讀檔案描述符的集合,可寫檔案描述符的集 合及異常檔案描述符的集合。
struct timeval結構用於描述一段時間長度,如果在這個時間內,需要監視的描述符沒有事件發生則函式返回,返回值為0。
注意:關於返回值問題,若有就緒描述符則為其數目,若超時則為0,若出錯則為1
2.幾個重要的巨集
fd_clr(inr fd,fd_set* set);用來清除描述片語 set中相關 fd的位
fd_isset(int fd,fd_set *set);用來測試描述片語 set中相關 fd的位是否為真
fd_set(int fd,fd_set*set);用來設定描述片語 set中相關 fd的位
fd_zero(fd_set *set);用來清除描述片語 set的全部位引數
3.乙個重要的結構體
timeout為結構 timeval,用來設定 select()的等待時間,其結構定義如下:
struct timeval
;下面是常見的程式片段
fs_set readset;
fd_zero(&readset);
fd_set(fd,&readset);
select(fd+1,&readset,null,null,null);
if(fd_isset(fd,readset)
完成的**例子:
#include #include #include #include #define timeout 5 /* select timeout in seconds *
#define buf_len 1024 /* read buffer in bytes */
int main (void)
else if (!ret)
/** is our file descriptor ready to read?
* (it must be, as it was the only fd that
* we provided and the call returned
* nonzero, but we will humor ourselves.)
*/ if (fd_isset(stdin_fileno, &readfds))
if (len)
return 0;
} return 1;
}
**不是很長,是乙個最簡單的例子,很好理解。 簡單Socket通訊
示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊 這裡只是乙個簡單的示例,是乙個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。下面是示例程式的簡單步驟說明 伺服器端 第一步 用指定的埠號和伺服器的ip...
socket 簡單通訊
服務端 1.建立乙個服務端 import socket phone socket.socket 括號內不輸入,預設為family addressfamily.af inet type socketkind.sock stream proto 0 2.為服務端建立ip位址及埠號 phone.bind ...
簡單socket通訊示例
int socket int domain,int type,int protocol domain 位址族 af unix,af local local communication unix域協議族 af inet ipv4 internet protocols af inet6 ipv6 int...