161: fprintf(stderr, "сбой поиска порта %s\n",
162: portAddress);
163:
164: if ((s = socket(addr->ai_family, addr->ai_socktype,
165: addr->ai_protocol)) < 0)
166: die("socket");
167:
168: if (bind(s, addr->ai_addr, addr->ai_addrlen))
169: die("bind");
170:
171: /* Основной цикл состоит из ожидания tftp-запроса, его обработки
172: и затем ожидания следующего запроса. */
173: while (1) {
174: bytes = recvfrom(s, &packet, sizeof(packet), 0, &from,
175: &fromLen);
176: if (bytes < 0) die("recvfrom");
177:
178: /* Если выполнить разветвление перед вызовом handleRequest() и
179: завершить дочерний процесс после возврата функции, то данный
180: сервер будет работать точно как параллельный tftp-сервер */
181: handleRequest(*addr, from, fromLen, packet);
182: }
183: }
17.7. Ошибки сокетов
Некоторые значения errno
встречаются только при работе с сокетами. Ниже приведен список специфических ошибок сокетов вместе с краткими их описаниями.
EADDRINUSE | Запрашиваемый адрес уже используется и не может быть переприсвоен. |
EADDRNOTAVAIL | Запрашивается несуществующий адрес. |
EAFNOSUPPORT | Указано неподдерживаемое семейство адресов. |
ECONNABORTED | Соединение прервано программным обеспечением. |
ECONNREFUSED | Удаленная машина отклонила попытку соединения. |
ECONNRESET | Соединение переустановлено удаленным концом. Это, как правило, указывает на то, что удаленная машина была перезагружена. |
EDESTADDRREQ | Выполнена попытка передачи данных через сокет без предоставления адреса назначения. Это может происходить только в дейтаграммных сокетах. |
EHOSTDOWN | Удаленный хост не находится в сети. |
EHOSTUNREACH | Удаленный хост недоступен. |
EISCONN | Для сокета уже установлено соединение. |
EMSGSIZE | Данные, передаваемые через сокет, слишком велики для отправления в одном элементарном сообщении. |
ENETDOWN | Сетевое соединение прекратилось. |
ENETRESET | Сеть была сброшена, что вызвало потерю соединения. |
ENETUNREACH | Указанная сеть недоступна. |
ENOBUFS | Для обработки запроса доступного пространства буфера недостаточно. |
ENOPROTOOPT | Выполнена попытка установить неправильную опцию. |
ENOTCONN | До выполнения операции необходимо установить соединение. |
ENOTSOCK | Специфическая сокетная операция была направлена на файловый дескриптор, который ссылается не на сокет. |
EPFNOSUPPORT | Указано неподдерживаемое семейство протоколов. |
EPROTONOSUPPORT | Запрос был сделан для неподдерживаемого протокола. |
EPROTOTYPE | Для сокета был указан несоответствующий тип протокола. |
ESOCKTNOSUPPORT | Выполнена попытка создания неподдерживаемого типа сокета. |
ETIMEDOUT | Время соединения истекло. |
17.8. Унаследованные сетевые функции