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 操作函式返回之前,該程序不會被掛...