#include#include#include
#include
#include
#include
in.h>#include
#include
#include
#include
#include
using
namespace
std;
#define maxsize 2048std::queue
socketqueue;
/*tcp多執行緒併發,非阻塞io模式,
單執行緒對socket遍歷。
因為設定socket為非阻塞模式,所以能快速讀取是否有資料。
*/void *task(void *arg)
int socket =socketqueue.front();
socketqueue.pop();
fd_set rfds, wfds;
fd_zero(&rfds);
fd_zero(&wfds);
fd_set(socket, &rfds);
fd_set(socket, &wfds);
int selres = select(socket + 1, &rfds, &wfds, null, null);
//socket 可讀
char msg[maxsize] = ;
int len = 0
;
if (1 == fd_isset(socket, &rfds))
}else
//socket 可寫
if (1 == fd_isset(socket, &wfds))
}else
len = 0
; socketqueue.push(socket);
}return
null;
}void
server_run()
struct
sockaddr_in my_addr;
bzero(&my_addr, sizeof
(my_addr));
my_addr.sin_family =af_inet;
my_addr.sin_port =htons(port);
my_addr.sin_addr.s_addr =htonl(inaddr_any);
printf(
"binding server to port %d\n
", port);
int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof
(my_addr));
if (err_log != 0
)
err_log = listen(sockfd, 10
);
if (err_log != 0
)
printf(
"waiting client...\n");
while (1
)
inet_ntop(af_inet, &client_addr.sin_addr, cli_ip, inet_addrstrlen);
printf(
"client ip = %s\n
", cli_ip);
//設定socket為非阻塞模式。
fcntl(newclient, f_setfl, fcntl(newclient, f_getfl, 0) |o_nonblock);
socketqueue.push(newclient);
}close(sockfd);
}int
main()
io模型 非阻塞模型
linux下,可以通過設定socket使其變為non blocking。當對乙個non blocking socket執行讀操作時,流程是這個樣子 從圖中可以看出,當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使...
PythonStudy 非阻塞IO模型
服務端 import socket import time import select server socket.socket server.bind 127.0.0.1 1688 server.listen 5 server.setblocking false 預設為阻塞 設定為false 表示...
I O模型 阻塞 非阻塞 I O復用 同步 非同步
第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...