本文共 1001 字,大约阅读时间需要 3 分钟。
在用epoll的边缘触发模式中,发现socket接收有异常,有时会出现新的socket连接到底,但是需要有新的数据到底时,epoll_wait才响应去接收数据这个问题。 原因分析: epoll的边缘触发模式下,同一端口可读时,epoll_wait只会提示一次。在accept中,当2个端口同时到达时,只会响应一次。这时就要用 while等循环函数去接收消息和接收accept响应,一般接收消息大家都会做,接收accept响应会忘。 代码修改:老代码:
INT32 conn_fd = accept( listen_fd, (sockaddr *)&clientaddr, &clilen );//accept4( event_fd, (sockaddr *)&clientaddr, &clilen, SOCK_NONBLOCK ) if( conn_fd < 0 ) { MS_LOGER_FATAL("%s%s%s%s", LOG_CMD_FLAG , LOG_VOD_FLAG , "accept error" , strerror( errno )); } else { MS_LOGER_DEBUG("%s%s%s%d", LOG_CMD_FLAG , LOG_VOD_FLAG , "conn fd" , conn_fd); }新代码:
while (1) { INT32 conn_fd = accept( listen_fd, (sockaddr *)&clientaddr, &clilen );//accept4( event_fd, (sockaddr *)&clientaddr, &clilen, SOCK_NONBLOCK ) if( conn_fd < 0 ) { break; } else { MS_LOGER_DEBUG("%s%s%s%d", LOG_CMD_FLAG , LOG_VOD_FLAG , "conn fd" , conn_fd); } }新代码会循环接收accept的端口中新到的socket,而老的代码,若accept中有多个端口时,只处理一个,其他未处理的端口要等该端口有新数据到底才会响应。
转载地址:http://uvldi.baihongyu.com/