Сокет Программируя C/C++ - recv функция зависает?

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

люди Повышения не лежат:

, Почему организация должна использовать Повышение?

, Одним словом, Производительность. Использование высококачественных библиотек как начальное развитие скоростей Повышения, результаты в меньшем количестве ошибок, уменьшает reinvention-of-the-wheel и сокращает долгосрочные затраты на обслуживание. И так как библиотеки Boost склонны становиться де-факто или стандарты де-юре, многие программисты уже знакомы с ними.

Десять из библиотек Boost включены в TR1 Библиотеки Стандарта C++, и так намечены для более поздней полной стандартизации. Библиотеки More Boost готовятся для TR2. Пользование библиотеками Boost дает организации преимущество в принятии новых технологий.

Многие организация уже используют программы, реализованные с Повышением, как Adobe Acrobat Reader 7.0.

9
задан Naveen 11 December 2009 в 12:14
поделиться

5 ответов

Recv будет блокироваться до тех пор, пока сокет не получит информацию для чтения, пока сокет находится в режиме блокировки, вы можете изменить это с помощью fcntl.

Если вам интересно, почему он зависает, мой Предполагаю, что когда вы закрываете канал записи на сокете (также вы можете использовать константу SHUT_WR, поскольку это лучший стиль), сервер получает EOF и предполагает, что вы отключаетесь, хотя это может быть не так, если сервер настроен для его обработки.

Я бы посоветовал изучить возможность установки сокета в неблокирующий режим, а затем вызвать select , который будет блокироваться до тех пор, пока сокет не станет доступен для чтения / записи / или не будет запущен тайм-аут . В зависимости от того, что вы делаете, это будет иметь значение.

1
ответ дан 4 December 2019 в 12:19
поделиться

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

Для получения дополнительной информации о recv, если вы используете POSIX-совместимую систему) прочтите этот http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

1
ответ дан 4 December 2019 в 12:19
поделиться

Ммм ... почему вы отключили сокет ....

bytes_send = send(sock, a, strlen(a), 0);
    bytes_send = shutdown(sock, 1); /*** That I think is the problem! ***/


 bytes_recieved = recv(sock, recv_data, 4096, 0);

И все же вы продолжили в коде получать данные из того же сокета, который был отключен ??

Надеюсь это намекает вам в правильном направлении, С наилучшими пожеланиями, Том.

1
ответ дан 4 December 2019 в 12:19
поделиться

recv должен зависнуть до тех пор, пока вы не получите ответ от сервера, если вы заявили, что ответ отправляется.
Попробуйте wirehark или что-то в этом роде, чтобы обнюхать сеть и посмотреть, приходит ли реальный ответ или нет.

2
ответ дан 4 December 2019 в 12:19
поделиться

Ваш код будет блокироваться в вызове recv, пока сервер не отправит обратно какие-либо данные. Поскольку этого не происходит, возможно, вам стоит спросить себя, отправил ли ваш клиент полный запрос. Сервер, вероятно, не начнет отправлять ответ, пока не будет получен полный запрос.

Если ваш протокол клиент / сервер основан на тексте, например HTTP или SMTP, вы уверены, что ваш ответ завершен правильно? Сервер может ожидать CR + LF ('\ r \ n') вместо просто LF ('\ n') или ожидает, что пустая строка завершит запрос:

char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

PS. Вы не объявляете и не инициализируете "a" во фрагменте кода.

8
ответ дан 4 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: