一些可能会用到预备知识
代码下载地址
网络编程的过程呢, 我想用打电话来形容,但是这个电话可能有些不同
服务端编程
- 申请电话机 -> 申请 fd
int socket(int af,int type,int protocol);
// 建立一个socket用于连接
// af:address family,如AF_INET
// type:连接类型,通常是SOCK_STREAM或SOCK_DGRAM
// protocol:协议类型,通常是IPPROTO_TCP或IPPROTO_UDP,一般为0,意思是根据前两个参数来定
// 返回值:socket的编号,为-1表示失败
- 申请电话号码(这样别人才能打过来)-> 给 fd 绑定地址(ip 端口协议族等)
int bind(int socket,sockaddr * address,uint addrlen);
// 将一个地址和一个端口号绑定到一个socket连接上
// socket:之前创建的socket
// sockaddr:一个用来存放Ip地址和端口号的结构体
// addrlen:上述结构体的长度
// 返回值:为-1表示失败,若端口被占用,会从新绑定一个随机端口(仍返回失败)
// 地址绑定为0表示绑定本机所有IP
- 给电话配一个接线员(这就是资本的力量,这是必须的的一步)-> listener 来 listen
int listen(int socket,int maxconn);
// 将一个socket设置为监听状态,专门用来监听的socket叫做master socket
// maxconn:最大接收连接数
// 返回值:失败返回-1,成功返回0
- 接线员接电话-> accept
int accept(int socket,sockaddr * fromaddr,int * addrlen);
// 接收一个客户机的连接,返回一个socket,来自客户机的socket叫connected socket
// socket:用来监听的socket(master socket)
// fromaddr:客户机的地址信息
// addrlen:地址结构体的长度(输入输出参数)
// 返回值:返回一个新的socket,这个socket专门用来与此客户机通讯(connected socket
客户端编程
客户端编程就简化很多
- 申请电话机(电话机还是要有的)-> socket 同服务端编程
- 打电话(咱普通老百姓还是自己动手的好)-> connet
int connect(int socket,sockaddr * addr,int addrlen);【客户端】
// 使用当前socket连接一个地址(与服务器建立正式连接),此函数会触发服务器端的accept、select函数
// 注意:服务端接收的socket值和客户端socket值不一样
// addr:一般是服务器地址
- 客户端没有申请固定的电话号码,所以 connet 的时候会分配一个
- socket 为自己的电话机
- addr 为服务端的号码
- addrlen 为号码的长度