использование select для ожидания данных в клиентском сокете

любые идеи почему, когда сервер пишет сокет, пока клиент ждет 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);
}

Если я попытаюсь использовать select, он, похоже, не читает никаких данных. Если я добавлю 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] = {''};
        int bytesRead = read(socket_desc, &buffer, sizeof(buffer));
        printf("bytesRead %i : %s", bytesRead, buffer);
        if(bytesRead == 0){
            running = FALSE;
            printf("Shutdowning client.\n");

        }
    }

1 ответов


первым параметром для выбора должен быть максимальный идентификатор сокета плюс 1. Так что в вашем случае он должен быть!--2-->

socket_desc+1

можете ли вы попробовать с этим и посмотреть, работает ли это?

причина, по которой он появляется только при нажатии клавиши на клавиатуре, заключается в том, что stdin равен 0, который будет находиться в диапазоне 0 - (3 - 1), что и проверяется. Если вы установили первый параметр в socket_desc+1, то диапазон 0 - (socket_desc) должен быть проверен на наличие готовых сокетов