2013-07-31 2 views
0

У меня сервер приложений, который соединен с телнет клиента (т.е. телнет локальный _port_num - здесь номер порта тот же связан с серверным приложением),RECV функция Winsock розетки

Мое приложение работает правильно, но вещь Я использовал ПРИЕМ следующим образом:

#define BUFLEN 512 
char buf[BUFLEN]; 
iResult = recv(sd, (char *)buf, BUFLEN, 0); 

здесь возвращает RECV вызов, как только любой символ прессованного через подключенный телнет терминал, и большую часть времени iResult является 1 или несколько раз 2, хотя я бы не PRESS ENTER Клиент telnet отправляет кадр, содержащий один символ, на серверное приложение катион.

Как я могу убедиться, что recv должен вернуться после чтения BUFLEN? В случае использования linux recv работает как ожидалось, получите блоки до enter.

Любая помощь или указатели с благодарностью.

ответ

2

В: Как я могу убедиться, что ... BUFLEN прочитал?

A: Вы читаете цикл, пока не получите все персонажи, которых вы ожидаете. Или до тех пор, пока не получите тайм-аут или ошибку.

+0

Но я думаю, что это не правильно, recv должен блокироваться, пока не будет нажата клавиша ввода в терминале telnet. Если количество байтов больше, чем будет прочитано до BUFLEN и поднять соответствующую ошибку falg, а telnet сохранит данные, которые не читаются, и в следующем чтении я могу прочитать, откуда это осталось ... Моя роль в том, почему recv возвращается как в скором времени, когда один вход charator на telnet –

+1

'recv должен блокироваться до тех пор, пока не будет нажата клавиша ввода в терминале telnet' - no. Независимо от того, насколько вы хотите, чтобы документальное поведение recv() соответствовало вашим ожиданиям, дизайну и коду, оно не изменится. –

+0

Не могли бы вы исследовать ваш комментарий? Вы имеете в виду, что даже если мы не нажимаем enter через telnet-терминал, тогда он также отправит персонажа. Это противоречит клиенту telnet в Linux? –

1

Вам нужно вызвать функцию recv снова и снова до тех пор, пока не будет получен нужный объем данных. Обратите внимание, что при использовании сокетов TCP вы не можете удостовериться, что вы получаете все данные в одном приемном вызове. Если вы отправляете данные с помощью одного вызова TCP Send(), то вполне возможно, что вы получите его в нескольких приемах, поскольку сокеты TCP являются Stream Sockets.

Функция recv() возвращает количество полученных байтов, поэтому вы можете продолжать вызов функции до тех пор, пока не получите все байты.

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