台州网站建设方案,学生网站建设实训总结,用来做问卷调查的网站,做网站 兼职目录
1、TCP基本特征
2、TCP通信流程基本原理
#xff08;1#xff09;基本原理
#xff08;2#xff09;TCP通信代码实现
#xff08;3#xff09;核心API解析
1#xff09;地址绑定--bind
2)设置监听-listen
3)等待连接请求-accept-产生一个已连接套接字
41基本原理
2TCP通信代码实现
3核心API解析
1地址绑定--bind
2)设置监听-listen
3)等待连接请求-accept-产生一个已连接套接字
4发起连接请求--connect
3、服务器广播 TCP全称 Transmition Control Protocol即传输控制协议。是面向连接的协议。通常TCP 通信还会被冠以 可靠传输协议 的头衔。 但请注意这里的可靠并非指发出去的数据对方一定能收到这是不可能的而仅指TCP能使发送方可靠地知道对方是否收到了数据。
1、TCP基本特征
有连接通信双方需要事先连接成功方可传输数据有确认一方收到对端的任何数据都会给另一方发回执确认保证数据有序、不重复、丢失会重发如果网络拥堵会自动调节发送量采用帧异步的流式通信方式即通信双方每次的收发数据量不必相等 简单来讲TCP 类似于打电话说话前需要花一定的时间接通电话等到对方接听了之后双方才能开始通信通信的过程中每个数据的传送接收方都会给发送方回执确认断开的时候也会互相通知以便于释放各自相关的资源。可以看出来TCP 相对于 UDP 而言资源开销更大提供更丰富的功能TCP适合用在如下情形
传输质量要求较高不能丢失数据大数据量的通信以至于通信前后的连接和断开的开销可以忽略不计用户登录、账户管理等相关的功能
2、TCP通信流程基本原理
1基本原理 TCP的通信流程跟打电话是几乎一样的因此可以将通信的过程细分为主动发起连接者客户端和被动接受连接者服务端两方来分别讨论。
被动的服务端Server
socket:建立TCP套接字sockfd即通信端点bind:绑定套接字sockfd与网络地址即IP端口listing:设定套接字sockfd进入被动监听状态即将套接字设定为监听套接字accept:静静等待远程客户端的连接请求收到连接请求后得到一个专用于收发数据的连接套接字connfd使用连接套接字connfd与客户端通信
主动的客户端Client
socket:建立TCP套接字sockfd即通信端点connect:对服务端发起连接请求若连接成功则直接通过套接字sockfd与服务端通信
注意
在服务端中监听套接字和连接套接字是严格区分的不可混用服务端所绑定的地址IPPORT需要对外公开否则客户端无法发起连接客户端在发起连接前一般无需绑定地址此时系统会为此连接自动分配恰当的地址资源
2TCP通信代码实现 基本C/S代码Client客户端、Server服务端要演示TCP的通信过程只需要写一个服务端和客户端即可服务端负责建立被动监听套接字客户端负责主动发起连接。下面通过一个简单的消息反弹服务器即将客户端发来的消息直接原样反弹回去来了解TCP通信的基本流程和所涉及的API。
需要用到的头文件
#include arpa/inet.h
#include netinet/in.h
服务端Server 客户端Client 3核心API解析
1地址绑定--bind
#include sys/types.h /* See NOTES */
#include sys/socket.hint bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能将套接字 sockfd 与指定的IP和端口绑定注意对于绑定了某个协议套接字的地址不能重复绑定。
参数sockfd - 套接字文件描述符addr - 地址结构体包含了IPPORTaddrlen - 地址结构体长度
返回值成功返回 0失败返回-1一般而言TCP服务端套接字都需要绑定IP和端口否则客户端无法发起连接。
另外除非要指定客户端的地址信息TCP客户端套接字无需绑定IP和端口。核心使用结构体存放IP 端口号 家族协议
因为使用IPV4 、TCP或者UDP所有具有专属的结构体类型用来存放
const struct sockaddr *addr:通用类结构体类型
const struct sockaddr_in *addr:TCP和UDP专属类结构体类型struct sockaddr_in
{sa_family_t sin_family; /* Address family */in_port_t sin_port; /* Port number */struct in_addr sin_addr; /* Internet address *//* Pad to size of struct sockaddr. */ 让专属结构体和通用结构体大小能对齐起到扩容专属结构体的作用unsigned char __pad[__SOCK_SIZE__ - sizeof(short int)- sizeof(unsigned short int) - sizeof(struct in_addr)];
};int main()
{//创建服务器的套接字int ser_fd socket(AF_INET,SOCK_STREAM,0);if(ser_fd -1){perror(socket ... );return -1;}//等客户端来连接的流程部署 --- 你怎么让客户端能连你 通缉犯//服务器绑定套接字 把服务器的IP地址 和端口号 家族协议 绑定到外网把你的内网IP转成内存IP// IP地址分为 公网IP 内网IP struct sockaddr_in ser_addr;memset(ser_addr,0,sizeof(ser_addr));ser_addr.sin_family AF_INET;ser_addr.sin_port htons(8888);//host主机字节序 network网络字节序ser_addr.sin_addr.s_addr htonl(INADDR_ANY);//注意不能只绑定一个IP地址我们电脑是多网卡的有多个IPif(bind(ser_fd,(struct sockaddr *)ser_addr,sizeof(ser_addr)) -1){perror(bind ... );return -1;}else{printf(服务器绑定套接字成功\n);}return 0;
}
2)设置监听-listen
#include sys/types.h /* See NOTES */
#include sys/socket.hint listen(int sockfd, int backlog);功能将套接字的状态设置为被动监听状态设定该套接字的最大等待连接数为backlog
参数sockfd - 套接字文件描述符backlog - 等待连接数最大值
返回值成功返回 0失败返回-1 套接字被设定为被动监听状态后该套接字sockfd只能被动接收连接不能再主动发起连接。
backlog规定的是最大等待连接数而不是最大连接数在Linux中如果backlog被设定为0实质的最大等待连接数为4也就是最多允许同时处理4个远端请求。在Linux中backlog的最大值被限定在文件 /proc/sys/net/core/somaxconn 中。 另外要注意要将该函数与阻塞等待对端连接的accecpt()区分开:listen()只是设置套接字状态以及设定backlog数目它本身是不阻塞的不能望文生义以为 listen 就是监听等待对方该函数的名字很容易产生歧义。
3)等待连接请求-accept-产生一个已连接套接字
默认会堵塞--让进程进入睡眠态
#include sys/types.h /* See NOTES */
#include sys/socket.hint accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能阻塞等待TCP连接请求
参数sockfd - 套接字文件描述符服务器套接字addr - 客户端地址信息结构体不想查看连接的客户端信息可设定为NULLaddrlen - 地址结构体长度指针 不想查看连接的客户端信息可设定为NULL
返回值成功返回一个新的非负连接套接字描述符-成功连接的客户端套接字使用其进行通信失败返回-1
详解该函数默认会阻塞等待客户端连接请求当不需要保存客户端地址信息时后两个参数都可以被设定为NULL成功返回一个新的连接套接字是专用于与客户端通信的、能收发数据的套接字发送信息:write(客户端的对等套接字)---服务器发送给客户端
接收消息:read(客户端的对等套接字) accept进入不可中断睡眠态想让对应进程或者线程退出--pthread_cancel()
客户端调用close()函数的时候退出了服务器的read()返回0
客户端ctrlc退出了 注意
由 accept() 函数返回的套接字称为 已连接套接字这与其第一个参数 sockfd 被动监听套接字 不同
前者专用于与对端进行读/写操作后者专用于接收对端的连接请求它们职责分明不可混用。
4发起连接请求--connect
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能对指定地址的TCP服务端发起连接请求
参数sockfd - 套接字文件描述符addr - 服务端地址信息结构体addrlen - 地址结构体长度
返回值成功返回 0失败返回-1该函数会向指定服务器发送连接请求SYN正常情况下服务器会返回应答ACK和SYN2
然后该函数再返回一个ACK2给服务器此过程就是著名的TCP三次握手。
连接的建立是需要一定时间的在网络环境较差的条件下时间可能会比较长也就是说
connect() 函数在网络不通畅的情形下会阻塞。 3、服务器广播
支持多个客户端连接客户端发的消息让服务器帮忙妆发其他客户端都能收到
服务器思路