Оператор if содержит вызов функции socket, присваивание возвращаемого значения переменной sockfd и последующую проверку, является ли это присвоенное значение меньшим нуля. Мы могли разбить этот оператор на два оператора С следующим образом:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
но использованная в листинге 1.1 запись является типичным для языка С способом объединения двух строк. Поскольку в языке С оператор «меньше» (<) имеет более высокий приоритет, чем оператор присваивания, необходимо заключить в скобки операции присваивания и вызова функции (как это и сделано в листинге 1.1, в строке 10). Между двумя открывающими скобками мы всегда вставляем пробел как указание на то, что левая часть операции сравнения содержит также операцию присваивания. (Этот стиль позаимствован из исходного кода Minix [120].) Мы используем этот же прием в операторе while дальше в нашей программе.
Мы будем встречать множество различных вариантов использования термина
socket
, которая входит в API сокетов. В-третьих, там же мы ссылались и на «сокет TCP», который является синонимом
Если вызов функции socket оказывается неудачным, мы прерываем выполнение программы с помощью вызова функции
err_sys.
Она выдает сообщение об ошибке с ее описанием (например, «Протокол не поддерживается» — одна из возможных ошибок функции
socket
) и прерывает выполнение процесса. Эта функция создана нами, как и некоторые другие, начинающиеся с
err_
. Мы будем широко использовать их в примерах в последующих главах. Описание функций приводится в разделе Г.4.
12-16
Мы заполняем структуру адреса сокета Интернета (структура типа
sockaddr_in
с именем
servaddr
) IP-адресом и номером порта сервера. Сначала мы инициализируем всю структуру нулями, используя функцию
bzero
, затем устанавливаем номер порта в 13 (который является номером
argv[1]
). В этой структуре поля IP-адреса и номера порта должны иметь определенный формат: мы вызываем библиотечную функцию
htons
(host to network short), чтобы преобразовать двоичный номер порта в требуемый формат, и вызываем библиотечную функцию
inet_pton
(presentation to numeric), чтобы преобразовать аргумент командной строки в символах ASCII (например,
206.168.112.96
при выполнении данного примера) в двоичный формат.