UNIX: разработка сетевых приложений
Часть 377 из 399 Информация о книге
Листинг Г.1. Заголовочный файл unp.h
//lib/unp.h1 /* Наш собственный заголовочный файл */2 #ifndef __unp_h3 #define __unp_h4 #include "../config.h" /* параметры конфигурации для данной ОС */5 /* "../config.h" генерируется сценарием configure */6 /* изменив список директив #include,7 нужно также изменить файл acsite.m4 */8 #include <sys/types.h> /* основные системные типы данных */9 #include <sys/socket.h> /* основные определения сокетов */10 #include <sys/time.h> /* структура timeval{} для функции select() */11 #include <time.h> /* структура timespec{} для функции pselect() */12 #include <netinet/in.h> /* структура sockaddr_in{} и другие сетевыеопределения */13 #include <arpa/inet.h> /* inet(3) функции */14 #include <errno.h>15 #include <fcntl.h> /* для неблокируемых сокетов */16 #include <netdb.h>17 #include <signal.h>18 #include <stdio.h>19 #include <stdlib.h>20 #include <string.h>21 #include <sys/stat.h> /* для констант S_xxx */22 #include <sys/uio.h> /* для структуры iovec{} и ready/writev */23 #include <unistd.h>24 #include <sys/wait.h>25 #include <sys/un.h> /* для доменных сокетов Unix */26 #ifdef HAVE_SYS_SELECT_H27 #include <sys/select.h> /* для удобства */28 #endif29 #ifdef HAVE_SYS_SYSCTL_H30 #include <sys/sysctl.h>31 #endif32 #ifdef HAVE_POLL_H33 #include <poll.h> /* для удобства */34 #endif35 #ifdef HAVE_SYS_EVENT_H36 #include <sys/event.h> /* для kqueue */37 #endif38 #ifdef HAVE_STRINGS_H39 #include <strings.h> /* для удобства */40 #endif41 /* Три заголовочных файла обычно нужны для вызова ioctl42 для сокета/файла: <sys/ioctl.h>, <sys/filio.h>,43 <sys/sockio.h> */44 #ifdef HAVE_SYS_IOCTL_H45 #include <sys/ioctl.h>46 #endif47 #ifdef HAVE_SYS_FILIO_H48 #include <sys/filio.h>49 #endif50 #ifdef HAVE_SYS_SOCKIO_H51 #include <sys/sockio.h>52 #endif53 #ifdef HAVE_PTHREAD_H54 #include <pthread.h>55 #endif56 #ifdef HAVE_NET_IF_DL_H57 #include <net/if_dl.h>58 #endif59 #ifdef HAVE_NETINET_SCTP_H60 #include <netinet/sctp.h>61 #endif62 /* OSF/1 фактически запрещает recv() и send() в <sys/socket.h> */63 #ifdef __osf__64 #undef recv65 #undef send66 #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)67 #define send(a,b,c,d) sendto(a,b,c,d,0,0)68 #endif69 #ifndef INADDR_NONE70 #define INADDR_NONE 0xffffffff /* должно было быть в <netinet/in.h> */71 #endif72 #ifndef SHUT_RD /* три новые константы Posix.1g */73 #define SHUT_RD 0 /* отключение чтения */74 #define SHUT_WR 1 /* отключение записи */75 #define SHUT_RDWR 2 /* отключение чтения и записи */76 #endif77 #ifndef INET_ADDRSTRLEN78 #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0"79 1234567890123456 */80 #endif81 /* Нужно, даже если нет поддержки IPv6, чтобы мы всегда могли82 разместить в памяти буфер требуемого размера без директив #ifdef */