153:
154: if (argv[1]) portAddress = argv[1];
155:
156: memset(&hints, 0, sizeof (hints));
157:
158: hints.ai_socktype = SOCK_DGRAM;
159: hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
160: if ((rc = getaddrinfo(NULL, portAddress, &hints, &addr)))
161: fprintf(stderr, 'сбой поиска порта %s
',
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 | Указанная сеть недоступна. |