您的位置:首页 > 其它

非阻塞socket与epoll的ET模式结合使用注意事项

2015-08-10 16:56 316 查看
当非阻塞socket与epoll的ET模式结合使用进行编程时需要注意的事项:

当客户端与服务端建立连接数据通信完成后,即服务端收到客户端的数据后,再向客户端发送数据,当发送完数据后立马断开连接。客户端epoll_wait和read的处理:

while(1)

{

nfds = epoll_wait(epfd_rcv, events, EVENTSIZE , -1);// get the sockfd ready

if (nfds < 0){

if(errno
== EINTR)

continue;

else{

fprintf(stderr, "epoll_wait err:%s\n", strerror(errno));

return NULL;

}

}

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

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

if ( (sockfd = events[i].data.fd) < 0) {

continue;

}

num2=1;

while(num2>0)

{

num2 = read(sockfd, recv_buf, g_receive_package_size - data_buf_r[sockfd]);

if (num2 < 0) { //有对errno的处理

if
( (errno != EINTR) && (errno != EAGAIN) ) {

if (close(sockfd) == 0) {

...........

}

}

} else if (num2 == 0) { //无对errno的处理,当num2=0 时系统没有给errno赋新值,而errno是全局变量会保存上一次系统赋给它的值

if (close(sockfd) == 0) {

.............

}

}else{

.............

............

}

}

}

}

因为是非阻塞socket和ET模式,如果不进行循环read的话,服务器发送完数据后立即close掉连接,那么客户端能read到服务器发送来的数据但是捕捉不到服务器close连接的事件,而客户端的tcp/ip协议栈收到了服务器发来的FIN包,但由于应用程序中没有捕获到服务器close连接的事件,也就是没有read返回0,因此没有向服务器发送FIN包,导致客户端大量的CLOSE_WAIT.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: