使用poll實現的io多路復用服務端和客戶端

2021-07-17 02:23:39 字數 2460 閱讀 1828

參考:

使用poll實現的io多路復用服務端和客戶端。

客戶端通過子程序建立多個客戶端連線。

客戶端每隔1秒向服務端傳送乙個時間戳,

服務端接收到時間戳以後,儲存在本地的檔案中,

乙個客戶端對應乙個儲存檔案,

並將接收到的時間戳返回給客戶端。

**:服務端:

#include #include #include #include #include #include #include #include #include #include #include #include #include #define ip_addr 	"127.0.0.1"

#define port 59999

#define listen_q 5

#define open_max 100000

#define inftim -1

#define max_line 1024

static int socket_bind(const char* ip, int port);

static void do_poll(int ln_fd);

static void handle_conn(struct pollfd* conn_fds, int num, int* files);

int main()

static int socket_bind(const char* ip, int port)

bzero(&_addr, sizeof(_addr));

_addr.sin_family = af_inet;

inet_pton(af_inet, ip, &_addr.sin_addr);

_addr.sin_port = htons(port);

if(bind(ln_fd, (struct sockaddr*)&_addr, sizeof(_addr)) == -1)

return ln_fd;

}static void do_poll(int ln_fd)

else

break;}}

fflush(stdout);

if(i == open_max)

clients[i].events = pollin;

nmax = (i > nmax ? i : nmax);

if(--nready <= 0)

} handle_conn(clients, nmax, files); }}

static void handle_conn(struct pollfd* conn_fds, int num, int* files)

write(files[i], buf, n);

write(conn_fds[i].fd, buf, n);

} }}

客戶端:

#include #include #include #include #include #include #include #include #include #include #define max_line 	1024

#define ip_addr "127.0.0.1"

#define serv_port 59999

#define max(a,b) (a>b)?a:b

static void do_conn();

static void handle_conn(int sockfd);

int main(int args, char* argv)

else if(fpid == 0)

else

} return 0;

}static void do_conn()

handle_conn(sockfd);

}static void handle_conn(int sockfd)

; char recv_line[max_line] = ;

struct pollfd pfds[1];

pfds[0].fd = sockfd;

pfds[0].events = pollin|pollout;

while(1)

else if(ret < 0)

//printf("[%d] recv=%s\n", (int)getpid(), recv_line);

} if(pfds[0].revents & pollout) ;

sprintf(dt, "%d\n", _time);

memcpy(send_line, dt, strlen(dt));

int ret = write(sockfd, send_line, strlen(send_line));

if(ret < 0)

} sleep(1);

} shutdown(sockfd, shut_wr);

}

poll實現I O多路復用

poll函式原型 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率 這一點與select 函式不同,呼叫...

I O多路復用 poll

函式結構 int poll struct pollfd fds,nfds t nfds,int timeout 引數 返回值 和select一模一樣 events和revents events 關注事件 讀就緒 寫就緒 異常 輸入的時候起作用 revents 輸出結果,輸出的時候起作用 輸入輸出引數...

I O多路復用之poll

poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...