服务端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#define PORT "12345"
#define BUFFER_SIZE 1024
void error_handler(const char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
int main() {
int server_sock;
server_sock = socket(PF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
error_handler("socket() error");
}
struct epoll_event *ep_event;
struct epoll_event event;
struct sockaddr_in server_address;
bzero(&server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(atoi(PORT));
if (bind(server_sock, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {
error_handler("bind() error");
}
if (listen(server_sock, 5) == -1) {
error_handler("listen() error");
}
int ep_fd = epoll_create(BUFFER_SIZE);
ep_event = malloc(BUFFER_SIZE * sizeof(struct epoll_event));
event.events = EPOLLIN;
event.data.fd = server_sock;
epoll_ctl(ep_fd, EPOLL_CTL_ADD, server_sock, &event);
int event_cnt;
int client_sock;
struct sockaddr_in client_address;
socklen_t client_address_size = sizeof(client_address);
while (1) {
event_cnt = epoll_wait(ep_fd, ep_event, BUFFER_SIZE, -1);
if (event_cnt == -1) {
printf("epoll_wait() error");
break;
}
for (int i = 0; i < event_cnt; i++) {
if (ep_event[i].data.fd == server_sock) {
client_sock = accept(server_sock, (struct sockaddr *)&client_address, &client_address_size);
if (client_sock == -1) {
fputs("accept() error\n", stdout);
continue;
} else {
fputs("new connect..\n", stdout);
}
event.events = EPOLLIN;
event.data.fd = client_sock;
epoll_ctl(ep_fd, EPOLL_CTL_ADD, client_sock, &event);
printf("connect id : %d\n", client_sock);
} else {
char buffer[BUFFER_SIZE];
ssize_t str_len = read(ep_event[i].data.fd, buffer, BUFFER_SIZE);
if (str_len == 0) {
epoll_ctl(ep_fd, EPOLL_CTL_DEL, ep_event[i].data.fd, NULL);
close(ep_event[i].data.fd);
printf("disconnect id : %d\n", ep_event[i].data.fd);
} else {
write(ep_event[i].data.fd, buffer, str_len);
}
}
}
}
close(server_sock);
close(ep_fd);
return 0;
}