Michael J. Donahoo "TCP/IP Sockets in C, 2nd Edition" / Michael J. Donahoo "Программирование TCP/IP сокетов в Си, 2-ое издание": 2.1 IPv4 TCP клиент
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
recv() принимает блоки байт пока доступны данные, возвращая количество байт, скопированных в буфер или -1 в случае неудачи. victor8632 01.06.12 в 09:03 |
|
|
Возвращение функцией нулевого значения говорит о том, что приложение на другом конце закрыло TCP соединение. victor8632 01.06.12 в 09:05 |
||
|
Обратите внимание, что размер буфера, передаваемого через параметр в функцию recv(), учитывает возможность добавления нулевого символа окончания строки. victor8632 04.06.12 в 07:31 |
||
|
Вывод (печать) буфера: строки 66-67 victor8632 04.06.12 в 07:31 |
||
|
Мы выводим данные, посланные сервером, по мере их поступления. victor8632 04.06.12 в 07:32 |
||
|
Мы добавляем символ окончания строки ('\0') в конец каждой части полученных данных, так что их можно рассматривать как строку и для вывода воспользоваться функцией fputs(). victor8632 04.06.12 в 07:36 |
||
|
Мы не проверяем, совпадают ли полученные байты с отправленными. victor8632 04.06.12 в 07:37 |
||
|
Сервер может послать нечто совершенно другое (вплоть до размера строки) и все это будет записано в поток стандартного вывода. victor8632 04.06.12 в 07:45 |
||
|
Вывод перевода строки: строка 70 victor8632 04.06.12 в 07:45 |
||
|
После того, как мы получим столько же байт, сколько послали, мы выходим из цикла и выводим символ перехода на новую строку. victor8632 04.06.12 в 07:46 |
||
|
Закрытие подключения и выход: строки 72-73 victor8632 04.06.12 в 07:47 |
||
|
Функция close() информирует удаленный сокет, что общение с ним заканчивается, и потом освобождает локальные ресурсы, связанные с сокетом. victor8632 04.06.12 в 07:50 |
||
|
Наше клиентское приложение (как и все программы в этой книге) используют две функции обработки ошибок: victor8632 04.06.12 в 07:52 |
||
|
DieWithUserMessage(const char *msg, const char *detail) prefer211 21.05.12 в 08:20 |
||
|
Обе функции выводят заданную пользователем строку сообщения (msg) в поток вывода ошибок, а затем еще строку детального сообщения; потом они вызывают функцию exit() с возвратом кода ошибки, что приводит к прерыванию работы приложения. victor8632 04.06.12 в 08:31 |
||
|
Единственное отличие между этими функциями состоит в выводе детального сообщения. Для функции DieWithUserMessage() детальное сообщение может быть задано пользователем. victor8632 04.06.12 в 08:35 |
||
|
Для функции DieWithSystemMessage() детальное сообщение формируется системой и базируется на значении специальной переменной errno (которая описывает причину последнего сбоя, если он связан с системным вызовом). Мы вызываем функцию DieWithSystemMessage() только если ошибочная ситуация является результатом системного вызова, который устанавливает errno. victor8632 04.06.12 в 08:42 |
||
|
Для сохранения простоты программного кода, наши примеры не содержат много кода, посвященного восстановлению после ошибок - он просто сводится к прерыванию работы программы. Рабочий код, естественно, не должен сдаваться так быстро. victor8632 04.06.12 в 11:21 |
||
|
Если же нам нужно предоставить пользователю информацию без выхода, мы используем функцию printf(), если нужны возможности форматирования, и fputs() в противном случае. victor8632 04.06.12 в 11:25 |
||
|
В частности, мы стараемся не использовать функцию printf() для вывода фиксированных, предварительно отформатированных строк. victor8632 04.06.12 в 11:26 |
||
|
Единственная вещь, которую вы никогда не должны делать - это использовать строку, полученную из сети, как первый аргумент в функции printf(). victor8632 04.06.12 в 11:29 |
||
|
Это создает серьезные уязвимости в системе безопасности. Вместо этого используйте функцию fputs(). victor8632 04.06.12 в 11:31 |
||
|
Примечание: функции DieWith…() объвлены в заголовочном файле “Practical.h”. Однако, фактическая реализация этих функций содержится в файле DieWithMessage.c, который должен быть откомпилирован и слинкован со всеми примерами приложений, содержащимися в этом тексте. victor8632 04.06.12 в 11:44 |
||
|
DieWithMessage.c prefer211 21.05.12 в 08:20 |
||
|
Если мы откомпилируем файлы TCPEchoClient4.c и DieWithMessage.c создадим программу TCPEchoClient4, мы сможем соединиться с эхо сервером, находящемуся по интернет адрусу 169.1.1.1, при помощи следующей командной строки: victor8632 04.06.12 в 11:48 |
||
|
% TCPEchoClient4 169.1.1.1 "Echo this!" prefer211 21.05.12 в 08:21 |
||
|
Для того, чтобы наш клиент работал, мы нуждаемся в сервере. Множество систем включаю в себя эхо сервер для целей отладки и тестирования; однако по соображениям безопасности, такие сервера обычно по умолчанию выключены. Если у вас нет доступа к эхо серверу, то это хорошо: мы как раз собираемся его написать. victor8632 04.06.12 в 11:52 |
