這裡使用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 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,把小寫變為大寫,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行...