- 论坛徽章:
- 0
|
本帖最后由 akwhole 于 2013-04-07 21:25 编辑
下午测试EPOLLIN、EPOLLOUT的用法.
服务端关键代码如下:- for(i=0; i < nfds; i++)
- {
- fd = events[i].data.fd;
- printf("event is %d\n",events[i].events);
- if(fd == listen_fd)
- {
- conn_sock = accept(listen_fd, (struct sockaddr *)&addr_client, &addrlen);
- if(conn_sock < 0)
- {
- perror("[main]accept error1");
- exit(1);
- }
- set_non_block(conn_sock);
- ev.events = EPOLLET | EPOLLIN;
- ev.data.fd = conn_sock;
- if(-1 == epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_sock, &ev))
- {
- perror("[main]epoll ctl failed!");
- exit(1);
- }
- printf("client IP:%s Port:%d connect success!\n",inet_ntoa(addr_client.sin_addr),addr_client.sin_port);
- }
- else if(events[i].events & EPOLLIN)
- {
- char buff[50] = {0};
- read(fd, buff, 50);
- printf("EPOLL EVENTS %d\n", events[i].events);
- printf("EPOLLIN\n");
- events[i].events = EPOLLOUT | EPOLLET;
- epoll_ctl(epoll_fd, EPOLL_CTL_MOD, fd, &events[i]);
- printf("%s\n",buff);
- printf("change to EPOLLOUT\n");
- /*
- if(strlen(buff) == 0)
- {
- close(fd);
- }
- */
- }
- else if(events[i].events & EPOLLOUT)
- {
- printf("EPOLL EVENTS %d\n", events[i].events);
- printf("EPOLLOUT\n");
- events[i].events = EPOLLIN | EPOLLET;
- epoll_ctl(epoll_fd, EPOLL_CTL_MOD, fd, &events[i]);
- printf("change to EPOLLIN\n");
- }
- printf("next chu fa\n");
- }
复制代码 客户端代码比较简单- int main()
- {
- int connect_fd;
- int ret;
- int port = 50105;
- struct sockaddr_in srv_addr;
- connect_fd = socket(AF_INET, SOCK_STREAM, 0);
- if(connect_fd < 0)
- {
- perror("cannot create communication socket");
- return 1;
- }
- memset(&srv_addr, 0, sizeof(srv_addr));
- srv_addr.sin_family = AF_INET;
- srv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- srv_addr.sin_port = htons(port);
- ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
- if(-1 == ret)
- {
- perror("cannot connect to the server");
- printf("[CONNECT_ERROR]%s\n",strerror(errno));
- return 1;
- }
- sleep(5);
- printf("try write\n");
- write(connect_fd, "hello server!", 13);
- printf("write orver\n");
- sleep(10);
- return 0;
- }
复制代码 问题是: 客户端write操作后, EPOLLIN 、EPOLLOUT 各触发一次.
但是客户端关闭时, 未将fd从epoll中清除, 这是EPOLLIN、EPOLLOUT 交替触发,陷入死循环.
没想明白为什么会陷入死循环? 恳请高手指点下,谢谢.
|
|