高併發伺服器程式設計之epoll 二

2021-08-19 16:59:30 字數 2928 閱讀 2608

這裡使用epoll_data聯合體中的ptr指標。

#include #include #include #include #include #include #include #include #include #include #define max_size 5

typedef struct client_info

client_info;

int main(int argc, char *argv)

server_addr.sin_family = af_inet;

server_addr.sin_port = htons(9000);

server_addr.sin_addr.s_addr = inet_addr("192.168.121.128");

int len = sizeof(struct sockaddr_in);

ret = bind(server_fd, (struct sockaddr*)&server_addr, len);

if (ret == -1)

ret = listen(server_fd, max_size);

if (ret < 0)

int epoll_fd, nfds = 0, i = 0;

struct epoll_event ev, evs[max_size];

//建立乙個epoll監聽集合

epoll_fd = epoll_create(max_size);

client_info *pci = null;

pci = (client_info*)malloc(sizeof(client_info));

pci->fd = server_fd;

memcpy(&pci->addr, &server_addr.sin_addr, sizeof(struct in_addr));

pci->port = 0;

ev.events = epollin | epollet;

ev.data.ptr = pci;

//將監聽socket描述符與定義好的事件新增到epoll監聽集合中

if ((epoll_ctl(epoll_fd, epoll_ctl_add, server_fd, &ev)) < 0)

for (i = 0;ifd == server_fd)

printf("new accept----[%s:%d]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

pci = (client_info*)malloc(sizeof(client_info));

pci->fd = client_fd;

memcpy(&pci->addr, &client_addr.sin_addr, sizeof(struct in_addr));

pci->port = ntohs(client_addr.sin_port);

ev.events = epollin | epollet;

ev.data.ptr = pci;

//add event

ret = epoll_ctl(epoll_fd, epoll_ctl_add, client_fd, &ev);

if (ret < 0)

//epollin代表可讀事件

}else if (evs[i].events & epollin)

//除了上面2個錯誤之外則從監聽集合中刪除描述符並關閉socket

if ((epoll_ctl(epoll_fd, epoll_ctl_del, pci->fd, &ev)) < 0)

close(pci->fd);

}printf("%s----[%s:%d]\n", buff, inet_ntoa(pci->addr), pci->port);

}} }

close(server_fd);

free(pci);

return 0;

}

#include #include #include #include #include #include #include #include #include int main(int argc, char *argv)

int keepalive=1;

socklen_t kplen=sizeof(int);

if(setsockopt(sockfd,sol_socket,so_keepalive,(char *)&keepalive,kplen)!=0)

server_addr.sin_family = af_inet;

server_addr.sin_port = htons(9000);

server_addr.sin_addr.s_addr = inet_addr("192.168.121.128");

client_addr.sin_family = af_inet;

client_addr.sin_port = htons(8000);

client_addr.sin_addr.s_addr = inet_addr("192.168.121.128");

int len = sizeof(struct sockaddr_in);

ret = bind(sockfd, (struct sockaddr*)&client_addr, len);

if (ret == -1)

ret = connect(sockfd, (struct sockaddr*)&server_addr, len);

if (ret < 0)

char buff[1024] = ;

int i = 0;

while (1)

close(sockfd);

return 0;

}

14 15 高併發伺服器中epoll程式設計

1.通過epoll實現高併發伺服器模型 lt level triggered 是預設的工作方式,並且同時支援block和no block socket.在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式...

Epoll實現伺服器高併發

最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...

高併發伺服器(基於epoll)

本章節是用基本的linux unix基本函式編寫乙個完整的伺服器和客戶端例子,可在linux ubuntu 和unix freebsd 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,把小寫變為大寫,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行...