后面附有源代码,简单实现了通信,有许多不足的地方,后续更新完善。
目录
socket函数用于创建一个新的socket,也就是向系统申请一个socket资源.
bind() 函数把一个地址族中的特定地址赋给 socket。
3、listen()、connect() 主机监听、从机链接.
客户端调用connect()连接服务器,服务器调用listen()等待客户端的连接。
当两者建立了连接之后,就可以开始通过网络I/O模型进行数据交换了。
关闭连接,在数据传输完毕之后就要进行链接的关闭,一般关闭由客户端进行发起。
1、socket函数
socket函数用于创建一个新的socket,也就是向系统申请一个socket资源.
int socket(int domain, int type, int protocol);
三个参数,返回值非负数表示成功,-1表示出错
1.domain:协议域,常见的协议组用
AF_INET 是 IPv4 网络协议的套接字类型
AF_INET6 是IPv6的
AF_LOCAL AF_ROUTE 是 Unix 系统本地通信。
协议族决定了socket的地址类型,在通信中必须采用相应的地址.2.type: 指定socket的类型.
指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET
SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
SOCK_DGRAM: 使用不连续不可靠的数据包连接。
SOCK_SEQPACKET: 提供连续可靠的数据包连接。
SOCK_RAW: 提供原始网络协议存取。
SOCK_RDM: 提供可靠的数据包连接。
SOCK_PACKET: 与网络驱动程序直接通信。3.protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议.
2、bind() 函数
bind() 函数把一个地址族中的特定地址赋给 socket。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
三个参数
sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。socket()的返回值。
addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同。
addrlen:对应的是地址的长度。
3、listen()、connect() 主机监听、从机链接.
客户端调用connect()连接服务器,服务器调用listen()等待客户端的连接。
int listen(int sockfd, int backlog);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen函数会把sockfd的套接字标记为被动的监听listen状态,之后服务端与客户端通信的整个流程中sockfd只有listen和closed两种状态,第二个参数backlog代表等待队列的最大长度。
//返回值:成功则为0,失败为-1
connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。
//返回值:成功则为0,失败为-1
4 、accept 建立链接
服务端与客户端建立链接。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
第一