首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

socket 服务端有关问题

2012-09-12 
socket 服务端问题今天写了个服务端程序用的是 Unix domain tcp的方式,发现服务端在监听的时候出问题了服

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。

热点排行