2011-01-25 55 views
6

任何想法为什么当服务器在客户端等待时写入套接字select,选择永不完成?使用select来等待客户端套接字上的数据

我使用c来在套接字之间进行通信。我的客户端连接到我的服务器罚款。

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor 
client->address.sin_addr.s_addr = inet_addr(ipAddress); 
client->address.sin_family = AF_INET; 
client->address.sin_port = htons(port); 

bind(socket_desc,&address,sizeof(address)); 
connect(socket_desc, &address, sizeof(address)); 

当我使用的recv阻塞和监听数据,一切正常:

int bytesRead = 1; 
while(bytesRead){ 
    int bufsize=1024;   
    char *buffer=malloc(bufsize); 
    bytesRead = recv(socket_desc, buffer, bufsize, 0); 
    printf("CLIENT RECV: %s", buffer); 
} 

如果我尝试使用选择,它似乎并没有读取任何数据。如果我将STDIN添加到fd_set,我可以强制它从套接字中读取,但select似乎不会从socket_desc读取数据中触发...?

int running = 1; 
while(running){ 
    /* wait for something to happen on the socket */ 
    struct timeval selTimeout; 
    selTimeout.tv_sec = 2;  /* timeout (secs.) */ 
    selTimeout.tv_usec = 0;   /* 0 microseconds */ 
    fd_set readSet; 
    FD_ZERO(&readSet); 
    FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading 
    FD_SET(socket_desc, &readSet);//tcp socket 

    int numReady = select(3, &readSet, NULL, NULL, &selTimeout); 
      //IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD 
    if(numReady > 0){ 
     char buffer[100] = {'\0'}; 
     int bytesRead = read(socket_desc, &buffer, sizeof(buffer)); 
     printf("bytesRead %i : %s", bytesRead, buffer); 
     if(bytesRead == 0){ 
      running = FALSE; 
      printf("Shutdowning client.\n"); 

     } 
    } 

回答

8

的第一个参数来选择应该是最大的套接字ID加1。所以你的情况,应该是

socket_desc+1 

你可以尝试用,看看它是否起作用?

只有当您按下键盘上的按键时,才会得到它的原因是因为标准输入是0,它将在0 - (3 - 1)范围内,这是检查的内容。如果您将第一个参数设置为socket_desc + 1,则应检查0 - (socket_desc)范围,以便使用套接字

+1

另外值得注意的是,在多个套接字上选择时,您应该检查套接字ID是否使用FD_ISSET设置 – vmpstr 2011-01-25 02:28:45

相关问题