socket通訊之最簡單的I O 多路復用

2021-06-10 00:19:29 字數 1602 閱讀 3364

在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...