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;
}
...全文
439 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
heronism 2017-11-29
  • 打赏
  • 举报
回复
你的这个run()是在循环里面,如果是,获取到socket_fd里的socket下次进入的时候还在吗
岭南行僧 2017-11-29
  • 打赏
  • 举报
回复
只要连接没有断开,就会一直在的

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧