日期:2014-05-16  浏览次数:20828 次

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。