2010-12-30 3 views
2

С возвращением с вопросом C сокетов.Использование recv для приема входящего массива char

Я пытаюсь получить массив символов от клиента через TCP. У меня есть следующий ПРИЕМ код:

char buffer[2048]; 
int recvBytes = 0; 

while (1) { 

    if ((clntSockfd = accept(servSockfd, (struct sockaddr *) &clntAddr, &clntSockAddrLen)) == -1) { 
     printf("Unable to accept client connection\n"); 
    exit(1); 
} 
    else { 
     printf("Client connection accepted!\n"); 
    } 

    /* clear buffer */ 
    memset(buffer, 0, sizeof(buffer)); 

    recvBytes = recv (clntSockfd, buffer, sizeof(buffer), 0); 
    printf("Bytes received: %i\n", recvBytes); 
    printf("Char array received: %s\n", buffer); 
} 

Я отметил, что при исполнении, recvBytes показывает ноль в первой итерации. Только после второй итерации он берет входящий массив символов.

Я хотел бы узнать, будет ли блок recv, пока я не получу данные из входящего сокета? Как я должен отказаться от нежелательных символов в буфере, т. Е. Удалить символы, полученные с первой итерации.

Большое спасибо!

- редактировать ---

Привет всем, Я приложил консольный вывод из затмения.

**... <- initialization stuff 
Binding socket to port 
Socket binded 
Start listening on port 8081. 
Client connection accepted!     *while loop - first iteration 
Bytes received: 0       *while loop - first iteration 
Char array received:       *while loop - first iteration 
Client connection accepted!     *while loop - second iteration 
Bytes received: 22       *while loop - second iteration 
Char array received: 1~Message~HowAreYou? *while loop - second iteration** 

Надеюсь, что приведенный выше вывод консоли иллюстрирует мои вопросы более четкими, касающимися первой и второй итераций. Из вышесказанного первая итерация не принимает никаких байтов, но recv не блокирует. Я думал, что recv должен был блокироваться, пока он не получит байты?

+0

recv блокирует до тех пор, пока не будет символов, поэтому в буфере нет «нежелательных» символов - независимо от возвращаемого значения (recvBytes) - количество символов в буфере – KevinDTimm

+0

@KevinDTimm: если 'setsockopt' используется для установки сокет в неблокирующий режим. –

+0

Если ОП опубликует больше информации, мы могли бы дать более качественные ответы (IOW, качество ответа равно качеству вопроса) – KevinDTimm

ответ

0

Если вы знаете, чего ожидать от получаемых данных, вы можете удалить первый набор символов. Например, если вы знаете, какова будет длина пакета или источник сообщения или информация заголовка, вы можете проверить и проигнорировать первый набор символов.

+0

Спасибо ckv, я постараюсь сделать это. – Poliquin

+0

Эй, ckv, первые несколько персонажей оказываются нулевыми символами ... У меня проблема с попыткой сбросить первые несколько нулевых символов. – Poliquin

+0

Хорошо, дружище, понял. Вложенный recv в два цикла. – Poliquin

1

Если ваш сокет является блокирующим сокетом, функция recv будет блокироваться до получения некоторых данных. функция recv вернет 0 только тогда, когда другая сторона закрывает соединение в большинстве систем.

Предлагаю вам перепроверить свой код и выполнить его и сообщить нам точный результат.

Для получения более подробной информации см. here и here.

+0

Извините, у меня было дополнительное предложение, чтобы добавить к моему ответу и ударить по вашей ошибке по ошибке. Теперь вернулось, но оно все равно зарегистрировало редактирование. –

+0

Не проблема вообще Бен! На самом деле, если вы чувствуете, что для моего ответа требуются какие-либо изменения, пожалуйста, не стесняйтесь делать это. :) – Jay

+0

Эй, Джей! Спасибо за ссылки! Я читаю их сейчас! – Poliquin

1

Я считаю, что recv возвращает 0, если удаленный конец закрывает соединение (для сокетов потока, таких как TCP), или если принимается пакет без полезной нагрузки (сокеты datagram, такие как UDP).

Если сокет был установлен в режим без блокировки (по умолчанию блокирует), и нет никаких данных еще, вы получите код ошибки, либо EAGAIN или EWOULDBLOCK в зависимости от операционной системы.

В любом случае, каждый раз, когда возвращается recv, новые данные будут сохранены в начале буфера. Он не будет добавляться к ранее полученным данным, если вы не вычислите указатель, предназначенный для хранения новых данных после старого.

+0

Еще раз спасибо Ben Voight! Позвольте мне попробовать какой-то код – Poliquin

Смежные вопросы