Th:1.1 建立连接

news/2024/9/22 14:56:57/

基础讲解

1.TCP通信流程

基于TCP通信的Socket基本流程:

1.1 Socket

函数返回值:一个文件描述符: 特别的两个队列。

#include <sys/types.h>          
#include <sys/socket.h>
//create an endpoint for communication
int socket(int domain, // 协议:AF_INET (IPv4)、AF_INET6 (IPV6)....int type, 	// 套接字类型: SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)....int protocol// 协议:IPPROTO_TCP (TCP)、IPPTOTO_UDP (UDP)...; 当protocol为0时,会自动选择type类型对应的默认协议。
);
// 返回值:  返回值是一个非负整数, 代表一个文件描述符,用于标识创建的套接字,并通过这个描述符进行后续的网络I/O操作。

 setsockopt

        补充使用:防止系统断线后,重连等待!

1.2 Bind

绑定地址: 使用 bind函数 给 socket端点  绑定端口和IP (函数参考: man 2 bind)

#include <sys/types.h> 
#include <sys/socket.h>
//bind a name to a socket
int bind(int sockfd,					// socket端点文件描述符const struct sockaddr *addr,// 要绑定的IP地址和端口号socklen_t addrlen			// 指定的addr代表结构体长度,确保bind函数可以正确解析给定的地址信息:sizeod(addr)
);
//返回值: 成功时返回0。失败返回-1
  • const struct sockaddr *addr参数: 该参数用于提供给socket端点IP和端口信息, 但是sockaddr是一个通用的地址结构,实际使用的时候还是要使用sockaddr_in (IPv4)sockaddr_in6 (IPv6)

  • 在选择端口号设置时, 建议应当避开知名端口号的范围(<1024)。

  • 使用bind 函数时要注意其地址是大端法描述的,可能需要执行强制类型转换。

  • IP设置:

  • 当服务端设置监听IP地址时,对于IPv4,有几个特殊的IP地址可以使用:0.0.0.0
    // 表示服务端愿意接受指向服务器主机的任何IP地址的连接。
    自己主机IP
    // 无需赘述, 最正常操作
    127.0.0.1
    // 这个地址用于测试和开发,仅允许接收来自本机的回环连接。
    1.3 Listen

设置监听: 使用listen函数对设置好端口和IP的服务端socket端点监听外部连接请求 (函数参考: man 2 listen)

#include <sys/types.h>         
#include <sys/socket.h>
//listen for connections on a socket
int listen(int sockfd, 	// socket端点文件描述符int backlog		// 这个参数指定了套接字可以挂起的最大连接数
);
//返回值: 成功返回0, 失败返回-1
  • 一旦启用了listen之后,操作系统就知道该套接字是服务端的套接字,操作系统内核就不再启用其发送和接收缓冲区(回收空间),转而在内核区维护两个队列结构: 半连接队列和全连接队列。

1. 代码示例:

用户端

#include "threadPool.h"
//main.c 只调用一次 tcpInit(argv[1],argv[2],&sockfd); //连接的队列 
int tcpInit(const char *ip,const char* port, int *psockfd){ //(固定用法)// socket ---setsockopt--- bind--- listen//返回值:socket() 返回一个文件描述符 *psockfd,它代表新创建的套接字,用于后续的网络操作。*psockfd = socket(AF_INET,SOCK_STREAM,0); //ipv4 tcp 默认tcp 0 这里的调用指针的!(生成2队列!)//(固定用法)防止Time_wait函数 不让重连int reuse = 1;int ret = setsockopt(*psockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)); ERROR_CHECK(ret,-1,"setsockopt");// (固定用法)struct sockaddr_in addr; //为bind准备入参 ipv4addr.sin_family = AF_INET;addr.sin_port = htons(atoi(port));//端口addr.sin_addr.s_addr = inet_addr(ip);//ipret = bind(*psockfd,(struct sockaddr *)&addr,sizeof(addr));//固定用法 ERROR_CHECK(ret,-1,"bind");listen(*psockfd,50); //socket 制造的队列限制return 0;
}

客户端


http://www.ppmy.cn/news/1528860.html

相关文章

【服务器第二期】mobaxterm软件下载及连接

【服务器第二期】mobaxterm软件下载及连接 前言什么是SSH什么是FTP/SFTP mobaxterm软件介绍mobaxterm软件下载SSH登录使用方法1-新建ssh连接方法2-打开已有的ssh连接方法3-通过ssh命令建立连接 SFTP数据传输方法1-建立ssh连接后直接拖拽方法2-建立sftp连接再拖拽方法3-直接使用…

Selenium实现滑动滑块验证码验证!

背景&#xff1a;在部分的登录中有滑动验证码的验证&#xff0c;由于滑动验证码的缺块是随机的就导致实现起来比较困难&#xff01; 01、实现方案 模板匹配 通过openCV分析两个图片的相似度&#xff0c;获取两个相似度很高图片的坐标&#xff0c;从而计算两个图片的距离。 轮…

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…

【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现

1.二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 前序遍历方式&#xff1a;根-左子树-右子树。 递归实现&#xff1a; 要传一个子函数来实先递归&#xff0c;原因是原函数返回值为vector&#xff0c;在原函数迭代&#xff0c;返回值就难…

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…

Spark SQL性能优化高频面试题及答案

目录 高频面试题及答案1. 如何通过分区(Partitioning)优化Spark SQL查询性能?2. 什么是数据倾斜(Data Skew)?如何优化?3. 如何使用广播(Broadcast)优化Join操作?4. 如何优化Spark SQL的Shuffle操作?5. 如何通过缓存(Cache)优化Spark SQL的性能?6. 如何使用合适的…

网络丢包定位记录(二)

网卡驱动丢包 查看&#xff1a;ifconfig eth1/eth0 等接口 1.RX errors: 表示总的收包的错误数量&#xff0c;还包括too-long-frames错误&#xff0c;Ring Buffer 溢出错误&#xff0c;crc 校验错误&#xff0c;帧同步错误&#xff0c;fifo overruns 以及 missed pkg 等等。 …

python qt5 常用

QT5中如何设置让窗口根据屏幕比例显示设置&#xff1f; desktop QDesktopWidget().screenGeometry() self.resize(int(desktop.width() * 0.3), int(desktop.height()*0.5)) QT5中关于背景穿透问题的处理方式&#xff1f; 场景如下&#xff1a;我们在开发的时候&#xff0c…