c语言epoll_wait参数,流?I/O操作?阻塞?epoll? Go面试被问到 epoll,头大!

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define SERVER_PORT (7778)

#define EPOLL_MAX_NUM (2048)

#define BUFFER_MAX_LEN (4096)

char buffer[BUFFER_MAX_LEN];

void str_toupper(char *str)

{

int i;

for (i = 0; i < strlen(str); i ++) {

str[i] = toupper(str[i]);

}

}

int main(int argc, char **argv)

{

int listen_fd = 0;

int client_fd = 0;

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

socklen_t client_len;

int epfd = 0;

struct epoll_event event, *my_events;

/ socket

listen_fd = socket(AF_INET, SOCK_STREAM, 0);

// bind

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

server_addr.sin_port = htons(SERVER_PORT);

bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

// listen

listen(listen_fd, 10);

// epoll create

epfd = epoll_create(EPOLL_MAX_NUM);

if (epfd < 0) {

perror("epoll create");

goto END;

}

// listen_fd -> epoll

event.events = EPOLLIN;

event.data.fd = listen_fd;

if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &event) < 0) {

perror("epoll ctl add listen_fd ");

goto END;

}

my_events = malloc(sizeof(struct epoll_event) * EPOLL_MAX_NUM);

while (1) {

// epoll wait

int active_fds_cnt = epoll_wait(epfd, my_events, EPOLL_MAX_NUM, -1);

int i = 0;

for (i = 0; i < active_fds_cnt; i++) {

// if fd == listen_fd

if (my_events[i].data.fd == listen_fd) {

//accept

client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len);

if (client_fd < 0) {

perror("accept");

continue;

}

char ip[20];

printf("new connection[%s:%d]n", inet_ntop(AF_INET, &client_addr.sin_addr, ip, sizeof(ip)), ntohs(client_addr.sin_port));

event.events = EPOLLIN | EPOLLET;

event.data.fd = client_fd;

epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &event);

}

else if (my_events[i].events & EPOLLIN) {

printf("EPOLLINn");

client_fd = my_events[i].data.fd;

// do read

buffer[0] = '';

int n = read(client_fd, buffer, 5);

if (n < 0) {

perror("read");

continue;

}

else if (n == 0) {

epoll_ctl(epfd, EPOLL_CTL_DEL, client_fd, &event);

close(client_fd);

}

else {

printf("[read]: %sn", buffer);

buffer[n] = '';

#if 1

str_toupper(buffer);

write(client_fd, buffer, strlen(buffer));

printf("[write]: %sn", buffer);

memset(buffer, 0, BUFFER_MAX_LEN);

#endif

/*

event.events = EPOLLOUT;

event.data.fd = client_fd;

epoll_ctl(epfd, EPOLL_CTL_MOD, client_fd, &event);

*/

}

}

else if (my_events[i].events & EPOLLOUT) {

printf("EPOLLOUTn");

/*

client_fd = my_events[i].data.fd;

str_toupper(buffer);

write(client_fd, buffer, strlen(buffer));

printf("[write]: %sn", buffer);

memset(buffer, 0, BUFFER_MAX_LEN);

event.events = EPOLLIN;

event.data.fd = client_fd;

epoll_ctl(epfd, EPOLL_CTL_MOD, client_fd, &event);

*/

}

}

}

END:

close(epfd);

close(listen_fd);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值