思维导图
一.服务器的搭建
1.创建服务器套接字
函数原型:int socket(int domain, int type, int protocol);
功能描述:创建一个套接字文件,参数不同,功能类型就会不同
参数描述: 参数 domain:网络介质, 最常用的就是: AF_INET
参数 type:套接字类型,tcp协议用的就是这种套接字 SOCK_DGRAM:
udp协议使用的是这种套接字
如果套接字类型为 SOCK_STREAM,protocol 为0,则自动选用tcp协议
如果套接字类型为 SOCK_DGRA2M,protocol 为0,则自动选用udp协议
2.提前准备地址信息结构体
struct sockaddr_in{
unsigned short sin_family; // 这是一个标记位,固定写 AF_INET
unsigned short sin_port; // 端口号
struct in_addr sin_addr;// 一个结构体,结构如下
struct in_addr{
unsigned int s_addr; // 用来存放ip地址的变量
}
unsigned char zero[8]; // 没有实际意义,完全为了字节对齐填充大小 }
}
3. 为服务器套接字绑定信息
函数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能描述:将写有ip和port地址信息结构体,写入套接中
参数描述: 参数 sockfd:准备写入ip和port的套接字
参数 addr:写有ip和port的结构体地址,该结构体如下
struct sockaddr {
unsigned short sa_family; // 固定写 AF_INET
char sa_data[14]; // 这个14个字节的内存里面,就是用来存放 ip 和 port的
}
4.创建监听列表
函数原型:int listen(int sockfd, int backlog);
功能描述:创建监听列表并监听客户端连接,如果有客户端连接,则将该客户端加入监听列表中
参数描述: 参数 sockfd:哪个描述符需要监听并创建监听列表,一般就是服务器的描述符 参数 backlog:监听列表的大小
5.在监听列表中接受客户端的连接
函数原型:int listen(int sockfd, int backlog);
功能描述:创建监听列表并监听客户端连接,如果有客户端连接,则将该客户端加入监听列表中
参数描述: 参数 sockfd:哪个描述符需要监听并创建监听列表,一般就是服务器的描述符 参数 backlog:监听列表的大小
二.客户端的创建
1.创建套接字
2.提前准备地址信息结构体
3.连接服务器
函数原型:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能描述:根据提供的ip和port连接到指定服务器
参数描述: 参数 sockfd:客户端套接字
参数 addr:存有ip和port的一个通用地址信息结构体
参数 addrlen:第2个参数的实际长度
运行时需要先启动服务器,在运行客户端,如用gcc sever.c -o sever 编译服务器,gcc client.c -o client 编译客户端,代码并未显出头文件,需要自行用man手册查询