linux中網路程式設計I O模型 poll

2021-09-11 06:03:34 字數 4295 閱讀 7781

poll函式原型:

int

poll

(struct

pollfd

*fds,

unsigned

int nfds,

int timeout)

;struct

pollfd

poll引數列表:

events和reevents值列表:

事件分類

事件**

意義合法事件

pollin

有可讀資料

合法事件

pollrdnorm

有普通資料可讀

合法事件

pollrdband

有優先資料可讀

合法事件

pollpri

有緊急資料可讀

合法事件

pollout

寫資料不會導致阻塞

合法事件

pollwrnorm

寫普通資料不會導致阻塞

合法事件

pollwrband

寫優先資料不會導致阻塞

合法事件

pollmsgsigpoll

訊息可用

非法事件

poller

指定的檔案描述符發生錯誤

非法事件

pollhup

指定的檔案描述符掛起事件

非法事件

pollnval

指定的檔案描述符非法

poll函式的行為:

成功時,poll返回fds中revents不為0的檔案描述符的數量;如果超時前沒有任何事件發生,返回0。失敗時,返回-1,並設定errno為下列值之一:

1)ebadf:乙個或多個結構體中指定的檔案描述無效

2)efaultfds:指標指向的位址空間超出程序的位址空間

3)eintr:請求的事件之前產生乙個訊號,呼叫可以重新發起

3)einvalnfds:引數超出plimit_nofile值

4)enomem:可用記憶體不足,無法完成請求

使用多路復用i/o實現server、client

server.cpp

#

include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define

ipaddress

"127.0.0.1"

#define

port

6666

#define

maxlen

1024

#define

listenq5#

define

open_max

1000

#define

inftim-1

//建立監聽socket,並bind和listen

intbind_and_listen()

printf

("socket ok\n");

my_addr.sin_family = af_inet;

my_addr.sin_port =

htons

(port)

;//將主機位元組序的監聽埠轉換成網路位元組序

my_addr.sin_addr.s_addr = inaddr_any;

//監聽來自所有網路的訊息

bzero(&

(my_addr.sin_zero),0

);//將需要監聽的socket:serverfd與本地主機繫結if(

bind

(serverfd,

(struct

sockaddr*)

&my_addr,

sizeof

(struct

sockaddr))

==-1)

printf

("bind ok\n");

if(listen

(serverfd, listenq)==-

1)printf

("listen ok\n");

return serverfd;

}//多路復用poll

void

do_poll

(int listenfd)

//檢查監聽描述符是否存在可讀訊息

if(poll_fds[0]

.revents & pollin)

}fprintf

(stdout

,"accpet a new client : %s:%d\n"

,inet_ntoa

(sock_client.sin_addr)

, sock_client.sin_port)

;for

(i =

1; i < open_max; i++)}

if(i == open_max)

//將新的描述符新增到度描述符集合中

poll_fds[i]

.events = pollin;

//記錄客戶鏈結套接字數量

maxi =

(i > maxi ? i : maxi);if

(--nready <=0)

}//處理所有客戶端發來的資料

char buffer[maxlen]

;memset

(buffer,0,

sizeof

(buffer));

int readlen =0;

for(i =

1; i < maxi; i++)//

write

(stdout_fileno, buffer, readlen);//

write

(poll_fds[i]

.fd, buffer, readlen);}

}}}int

main()

client.cpp

#

include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define

maxlen

1024

#define

port

6666

#define

max(a, b)

(a > b)

? a : b

static

void

handle_connection

(int sockfd)

;int

main

(int argc,

char

*ar**)

client.sin_addr.s_addr =

inet_addr

(ar**[1]

);client.sin_family = af_inet;

client.sin_port =

htons

(port)

; connfd =

socket

(af_inet, sock_stream,0)

;if(connfd <0)

if(connect

(connfd,

(struct

sockaddr*)

(&client)

,sizeof

(struct

sockaddr))

<0)

//處理鏈結描述符

handle_connection

(connfd)

;return0;

}static

void

handle_connection

(int sockfd)

write

(stdout_fileno, recvline, n);}

//檢測標準輸入描述符是否準備好

if(poll_fds[1]

.revents & pollin)

write

(sockfd, sendline, n);}

}}

linux中網路程式設計I O模型 select

select函式原型 int select int maxfdp,fd set readfds,fd set writefds,fd set errorfds,struct timeval timeout 這裡用到兩個結構體fd set和timeval。fd set可以理解為乙個集合,時存放檔案描述...

Linux網路程式設計之IO模型

同步是指乙個任務的完成需要依賴另外乙個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成。非同步是指不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了,非同步一般使用狀態 通知和 阻塞是指呼叫結果返回之前,當前執行緒會被掛起,...

《網路程式設計》I O 模型

在分析 i o 模型之前,首先了解 同步 i o 和 非同步 i o 的基本概念 同步 i o 程序呼叫 i o 操作函式時,在 i o 操作函式返回之前,該程序會被掛起 即阻塞 直到 i o 操作完成後返回 非同步 i o 程序呼叫 i o 操作函式時,在 i o 操作函式返回之前,該程序不會被掛...