/* IP地址结构, 历史原因使得ip被写在这么一个结构体里面 */ struct in_addr { unsigned int s_addr; /* 这是大端顺序 */ } #include/* 返回按照网络字节顺序的值 */ unsigned long int htonl(unsigned long int hostlong); unsigned short int htons(unsigned short int hostshort); /* 返回按照主机字节顺序的值 */ unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort); /* 因特网程序使用inet_aton合inet_ntoa的函数来实现ip地址和点分十进制串之间的转换 */ #include /* 若成功返回1, 失败返回0 application to network*/ int inet_aton(const char *cp, struct in_addr *inp); /* 返回指向点分十进制字符串的指针 network to application */ char *inet_ntoa(struct in_addr in); // hostinfo.c是DNS条目的栗子 /* DNS主机条目结构 */ struct hostent { char *h_name; /* 域名 */ char **h_aliases; /* 别名 */ int h_addrtype; /* 地址类型一般为AF_INET(因特网) */ int h_length; /* 地址长度,以字节为单位 */ char **h_addr_list; /* 一个以Null结尾的in_addr结构数组 */ }; #include /* 根据域名查找DNS主机条目 若成功返回非NULL指针,若出错则返回NULL指针,同时设置h_errno。 */ struct hostent *gethostbyname(const char *name); /* 根据ip地址查找DNS主机条目 若成功返回非NULL指针,若出错则返回NULL指针,同时设置h_errno。 */ struct hostent *gethostbyaddr(const char *addr, int len, 0) /* 套接字地址结构 */ /* 普通套接字结构 */ struct sockaddr { unsigned short sa_family; /* 协议族 */ char sa_data[14]; /* 地址数据 */ } /* 英特网套接字结构 */ struct sockaddr_in { unsigned short sin_family; /* AF_INET */ unsigned short sin_port; /* 端口,大端顺序 */ struct in_addr sin_addr; /* IP地址,以大端顺序 */ unsigned char sin_zero[8]; /* sizeof(struct sockaddr) */ } #include #include /* 创建套接字 成功返回非负描述符,若出错则返回-1 */ int socket(int domain, int type, int protocol); /* PS: clientfd = socket(AF_INET, SOCK_STREAM, 0) */ /* 套接字链接 成功返回非负描述符,若出错则返回-1 */ int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); /* 地址绑定函数 */ int bind(int sockfd, struct sockaddr *my)addr, int addrlen); /* 侦听方法 */ int listen(int sockfd, int backlog); /* 接收链接 */ int accept(int listenfd, struct sockaddr *addr, int *addrlen); #include /* 获取环境变量。我用bash试了一下,可以取到Bash中的环境变量。但是这个变量具体是进程中的还是系统的,还是cgi变量什么的,或者只能是bash变量什么的还不是很清楚*/ char* getenv(const char *name); #include "csapp.h" /* 以下函数是《深入理解计算机系统》中的函数 成功返回描述符,Unix出错返回-1,DNS出错返回-2 */ int open_clientfd(char *hostname, int port); int open_listenfd(int port);