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: %dn", 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。