linux使用select出现FD_ISSET检测不到客户端的send事件,求大神指导
岭南行僧 2017-11-24 09:56:02 情况说明: 进过几次测试,存在问题
客户端在connect 时,服务端检测到事件,所以accpet操作,添加新的连接。 客户端在进行send,此时服务器检测不到任何事件,只能在关闭连接时服务端才能检测到。代码情况如下:求大神指导
int run()
{
fd_set fdset;
struct timeval tv;
int ret;
int nSocket_Cnt;
int nMaxSocket;
int socket_fd[MAX_NUM];
char recvBuffer[1024];
nSocket_Cnt = 0;
nMaxSocket = g_nServerSocket;
memset(socket_fd,0x0,sizeof(socket_fd));
memset(recvBuffer,0x0,sizeof(recvBuffer));
LOG_INFO("init nMaxSocket[%d]",nMaxSocket);
while(1){
if(g_bQuit){
break;
}
FD_ZERO(&fdset);
FD_SET(g_nServerSocket, &fdset);
tv.tv_sec = 0;
tv.tv_usec = 100000; //100毫秒
set_maxSocket(socket_fd,nSocket_Cnt,nMaxSocket,fdset); //获取nMaxSocket,对有效fd进行FD_SET
ret = select(nMaxSocket + 1, &fdset, NULL, NULL, &tv);
if(ret == 0){
continue;
}else if(ret == -1){
if(errno != EINTR){
LOG_ERROR("select error [%d:%s]",errno,strerror(errno));
break;
}else{
LOG_WARN("EINTR continue");
continue;
}
}
for(int i=0; i <= nSocket_Cnt; ++i){
if(FD_ISSET(socket_fd[i], &fdset)){
int headLen;
headLen = my_recv(socket_fd[i], recvBuffer, sizeof(recvBuffer));
if(headLen < 0){
set_close(socket_fd[i],nSocket_Cnt,fdset);
continue;
}
Hexdump(recvBuffer,headLen,"my_recv Headdata");
}
}
if(FD_ISSET(g_nServerSocket, &fdset)){
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int client_fd = accept(g_nServerSocket, (struct sockaddr*)&addr, &addrlen);
if(client_fd < 0){
if(errno != EINTR){
return -1;
}
LOG_WARN("accept errno = %d, error = %s", errno,strerror(errno));
continue;
}
LOG_INFO("new accept client_fd[%d]",client_fd);
if(nSocket_Cnt < MAX_NUM ){
int i;
for(i=0;i < MAX_NUM; i++){
if(socket_fd[i] == 0){
socket_fd[i] = client_fd;
++nSocket_Cnt;
break;
}
}
if(i == MAX_NUM){
LOG_ERROR("i[%d] == MAX_NUM[%d]",i,MAX_NUM);
break;
}
}else{
LOG_ERROR("nSocket_Cnt[%d] > MAX_NUM[%d]",nSocket_Cnt,MAX_NUM);
break;
}
}
}
for(int i=0;i<=nSocket_Cnt;++i){
close(socket_fd[i]);
}
return 0;
}