网络编程的一些基础

/* 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);