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

0

Возвращение функцией нулевого значения говорит о том, что приложение на другом конце закрыло TCP соединение.

victor8632 01.06.12 в 09:05

0

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

victor8632 04.06.12 в 07:31

0

Вывод (печать) буфера: строки 66-67

victor8632 04.06.12 в 07:31

0

Мы выводим данные, посланные сервером, по мере их поступления.

victor8632 04.06.12 в 07:32

0

Мы добавляем символ окончания строки ('\0') в конец каждой части полученных данных, так что их можно рассматривать как строку и для вывода воспользоваться функцией fputs().

victor8632 04.06.12 в 07:36

0

Мы не проверяем, совпадают ли полученные байты с отправленными.

victor8632 04.06.12 в 07:37

0

Сервер может послать нечто совершенно другое (вплоть до размера строки) и все это будет записано в поток стандартного вывода.

victor8632 04.06.12 в 07:45

0

Вывод перевода строки: строка 70

victor8632 04.06.12 в 07:45

0

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

victor8632 04.06.12 в 07:46

0

Закрытие подключения и выход: строки 72-73

victor8632 04.06.12 в 07:47

0

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

victor8632 04.06.12 в 07:50

0

Наше клиентское приложение (как и все программы в этой книге) используют две функции обработки ошибок:

victor8632 04.06.12 в 07:52

0

DieWithUserMessage(const char *msg, const char *detail)
DieWithSystemMessage(const char *msg)

prefer211 21.05.12 в 08:20

0

Обе функции выводят заданную пользователем строку сообщения (msg) в поток вывода ошибок, а затем еще строку детального сообщения; потом они вызывают функцию exit() с возвратом кода ошибки, что приводит к прерыванию работы приложения.

victor8632 04.06.12 в 08:31

0

Единственное отличие между этими функциями состоит в выводе детального сообщения. Для функции DieWithUserMessage() детальное сообщение может быть задано пользователем.

victor8632 04.06.12 в 08:35

0

Для функции DieWithSystemMessage() детальное сообщение формируется системой и базируется на значении специальной переменной errno (которая описывает причину последнего сбоя, если он связан с системным вызовом). Мы вызываем функцию DieWithSystemMessage() только если ошибочная ситуация является результатом системного вызова, который устанавливает errno.

victor8632 04.06.12 в 08:42

0

Для сохранения простоты программного кода, наши примеры не содержат много кода, посвященного восстановлению после ошибок - он просто сводится к прерыванию работы программы. Рабочий код, естественно, не должен сдаваться так быстро.

victor8632 04.06.12 в 11:21

0

Если же нам нужно предоставить пользователю информацию без выхода, мы используем функцию printf(), если нужны возможности форматирования, и fputs() в противном случае.

victor8632 04.06.12 в 11:25

0

В частности, мы стараемся не использовать функцию printf() для вывода фиксированных, предварительно отформатированных строк.

victor8632 04.06.12 в 11:26

0

Единственная вещь, которую вы никогда не должны делать - это использовать строку, полученную из сети, как первый аргумент в функции printf().

victor8632 04.06.12 в 11:29

0

Это создает серьезные уязвимости в системе безопасности. Вместо этого используйте функцию fputs().

victor8632 04.06.12 в 11:31

0

Примечание: функции DieWith…() объвлены в заголовочном файле “Practical.h”. Однако, фактическая реализация этих функций содержится в файле DieWithMessage.c, который должен быть откомпилирован и слинкован со всеми примерами приложений, содержащимися в этом тексте.

victor8632 04.06.12 в 11:44

0

DieWithMessage.c
1 #include
2 #include
3
4 void DieWithUserMessage(const char *msg, const char *detail) {
5 fputs(msg, stderr);
6 fputs(": ", stderr);
7 fputs(detail, stderr);
8 fputc('\n', stderr);
9 exit(1);
10 }
11
12 void DieWithSystemMessage(const char *msg) {
13 perror(msg);
14 exit(1);
15 }
DieWithMessage.c

prefer211 21.05.12 в 08:20

0

Если мы откомпилируем файлы TCPEchoClient4.c и DieWithMessage.c создадим программу TCPEchoClient4, мы сможем соединиться с эхо сервером, находящемуся по интернет адрусу 169.1.1.1, при помощи следующей командной строки:

victor8632 04.06.12 в 11:48

0

% TCPEchoClient4 169.1.1.1 "Echo this!"
Received: Echo this!

prefer211 21.05.12 в 08:21

0

Для того, чтобы наш клиент работал, мы нуждаемся в сервере. Множество систем включаю в себя эхо сервер для целей отладки и тестирования; однако по соображениям безопасности, такие сервера обычно по умолчанию выключены. Если у вас нет доступа к эхо серверу, то это хорошо: мы как раз собираемся его написать.

victor8632 04.06.12 в 11:52

0
Минутку...

← Предыдущая страница