socket 服务端问题
今天写了个服务端程序用的是 Unix domain tcp的方式,发现服务端在监听的时候出问题了
服务端
C/C++ code
fd_set rset,allset;;
max_fd = listen_sd;
while (1)
{
usleep(50);
FD_ZERO(&allset);
FD_SET(listen_sd,&allset);
ret = select(max_fd+1,&allset,NULL,NULL,NULL);
if(ret <= 0)
{
continue;
}
if(FD_ISSET(listen_sd, &allset))
{
client_sd = accept(listen_sd, NULL, NULL);
read(client_sd, &cmd, sizeof(cmd));
close(client_sd);
}
}
客户端
C/C++ code
while (1)
{
ret = write(listen_sd, &cmd, sizeof(COMMAND));
printf("write: %d\n", ret);
sleep(1);
}
客户端一直在不停地发送,但是为什么服务端只能接收到一次呢?服务端接受到一次以后就再也select不到了,如果把服务端稍作修改:
if(FD_ISSET(listen_sd, &allset))
{
client_sd = accept(listen_sd, NULL, NULL);
while(1)
{
read(client_sd, &cmd, sizeof(cmd));
}
close(client_sd);
}
这样就能读到客户端所有的包了,这是为什么呢?
------解决方案--------------------close写在里面,关闭了连接,就不会收到信息。
close写在外面,服务器端不断检测到客户端有消息发送过来,不会关闭连接。
------解决方案--------------------每次进入select之前请重新设置rset,wset,eset,因为select每次都会修改你的集合以便返回实际发生事件的FD。