использование select для ожидания данных в клиентском сокете - PullRequest
6 голосов
/ 25 января 2011

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

        }
    }

1 Ответ

8 голосов
/ 25 января 2011

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

socket_desc+1

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...