非阻塞IO模型

2022-06-19 12:21:14 字數 1891 閱讀 3013

#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 從核心向程序複製資料...