Th:1.1 建立连接

ops/2024/9/23 0:20:24/

基础讲解

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/ops/114488.html

相关文章

基于机器学习的注意力缺陷/多动障碍 (ADHD)(python论文+代码)HYPERAKTIV

简述 医疗保健领域的机器学习研究往往缺乏完全可重复性和可比性所需的公共数据。由于患者相关数据附带的隐私问题和法律要求&#xff0c;数据集往往受到限制。因此&#xff0c;许多算法和模型发表在同一主题上&#xff0c;没有一个标准的基准。因此&#xff0c;本文提出了一个公…

git push命令报错:the remote end hung up unexpectedly

Git Push报错信息如下 Total 3632 (delta 819), reused 3035 (delta 521) fatal: the remote end hung up unexpectedly 修复方式 找到项目下的隐藏文件夹.git&#xff08;注意前面是带着点的&#xff09;&#xff0c;修改里面的config这个文件&#xff0c;在最后加上以下内…

go mod文件为啥又两个require

go.mod 文件中&#xff0c;之所以有两个 require 块&#xff0c;这是 Go 自动化依赖管理的结果&#xff0c;具体解释如下&#xff1a; 主要依赖 (require 第一个块)&#xff1a; go复制代码require (github.com/gin-gonic/gin v1.10.0gorm.io/driver/mysql v1.5.7gorm.io/gorm …

ARM驱动学习之9注册字符类设备

ARM驱动学习之9注册字符类设备 • 分配内存空间函数kmalloc – 分配连续的虚拟地址&#xff0c;用于小内存分配。在include/linux/slab.h文件中。 – 参数1&#xff1a;申请的内存大小(最大128K)&#xff0c; – 参数2&#xff1a;GFP_KERNEL&#xff0c;代表优先权&#xff0…

c++primer第九章内存模型和名称空间学习笔记

单独编译 程序分为三步 函数定义和变量声明不能放在头文件中。 头文件经常包括的内容 结构声明可以放在头文件中。 头文件coordin.h代码 #ifndef COORDIN_H_ #define COORDIN_H_struct polar {double distance;double angle; }; struct rect {double x;double y; }; polar …

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一&#xff1a; 拓扑排序 软件构建 题目链接&#xff1a;卡码网&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文…

植物大战僵尸【源代码分享+核心思路讲解】

植物大战僵尸已经正式完结&#xff0c;今天和大家分享一下&#xff0c;话不多说&#xff0c;直接上链接&#xff01;&#xff01;&#xff01;&#xff08;如果大家在运行这个游戏遇到了问题或者bug&#xff0c;那么请私我谢谢&#xff09; 大家写的时候可以参考一下我的代码思…

小琳AI课堂:大语言模型如何符合伦理限制

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊大语言模型是如何符合伦理限制的&#xff0c;这可是一个非常重要的话题哦&#xff01;&#x1f31f; 首先&#xff0c;我们要知道&#xff0c;大语言模型的伦理限制实现主要通过以下几个方面&#xff1a; 数据筛选和清洗&a…