当前位置: 首页 > article >正文

TCP网络连接的书写

TCP网络连接的书写

文章目录

  • TCP网络连接的书写
    • 服务器端书写
      • 进程sock创建
      • 创建bind进行端口绑定(进行bind的初始化)
      • 监听socket
      • 获取链接
    • 用户端
      • 创建sock套接字
      • connect进行连接

服务器端书写

为TCP是面向连接,所有需要进行对于端口进行监控,另外的UDP的服务器就不需要进行端口的监控(面向字节流的)

进程sock创建

int listensock_ = socket(PF_INEF,SOCK_STREAM,0);

image-20230404193149069

创建bind进行端口绑定(进行bind的初始化)

struct sockaddr_in local;
memset(&local,0,sizeof(local));
local.sin_family = PF_INEF;
local.sin_port = htons(port_);
ip_.empty() ? (local.sin_addr.s_addr = INADDR_ANY) : (inet_aton(ip.c_str,&local.sin_addr));//这里的IANDDR_ANY云服务器独有的
bind(ListenSock_,(const struct sockaddr*)&local,sizeof(local));

这里要特别注意sockaddr与自己创建的sockaddr_t的区别,sockaddr_t为程序员使用的结构体,sockaddr为系统的使用的结构体。sockaddr_t区分了端口号与ip等网络的设置
因为许多的云服务器不一定都是一台主机对于一个ip地址,所有没有办法分辨相应的具体的ip使用。

image-20230404193224059

监听socket

因为TCP是面向连接,所以相应进行端口监听

listen(listen(listenSock_,5));

5的规定了内核应该为相应套接字排队的最大连接个数。用SOMAXCONN则为系统给出的最大值,这里是阻塞示进行等待获取到连接端口的信息就会返回。获取链接

image-20230404193324866

获取链接

使用accept进行获取一个新的sock fd(新的网络套件字),这个套件字使用进行文件的传输。(这个fd是全双工的)

struct sockaddr_in peer;
socklen_t len = sizeof(peer)''
int serviceSock = accept(listenSock_,(struct sockaddr*)&peer,&len);

uint16_t peerPort = ntohs(peer.sin_port);
std::string peeerIp = inet_ntoa(peer.sin_addr);

这里面的peer是输出型参数,储存用户端ip以及端口号,用户端的端口可以不固定,但是服务器的IP和端口一定要固定,防止客户端访问不到服务器的内容。

这里获取的是网络序列的数据,需要转换成为主机序列。(ntohs与inet_ntoa的用法基本相同,只不过转换的东西不同,一个是端口号,一个是IP号)。

image-20230404193406873

用户端

使用者的不同会造成不同的书写方法。

创建sock套接字

int scok = socket(AF_INEF,SOCK_STREAM,0);

connect进行连接

连接服务器需要进行connect,而且系统会自动进行bind(会自动进行分配端口),因为客服端不需要固定的端口进行操作,所以端口不固定。

struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(serverPort);

memset(&server,0,sizeof(server));//清空server所以的东西

获取链接之后,就可以使用sock fd进行数据的操作。

image-20230404193645051


http://www.kler.cn/a/10664.html

相关文章:

  • Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法
  • 2024年【汽车修理工(高级)】考试试卷及汽车修理工(高级)证考试
  • [极客大挑战 2019]PHP 1
  • FPGA实现以太网(二)、初始化和配置PHY芯片
  • 大模型 | 2024年中国智能算力行业白皮书 | 附PDF免费下载
  • Electron 项目中杀掉进程的不同方式
  • 【MySQL面试题小结2023】
  • Linux文件权限
  • 借助Nacos配置中心实现一个动态线程池
  • 旅游酒店住宿
  • CF55D-Beautiful numbers (数位dp)
  • 自动化测试学习(七)-正则表达式,你真的会用吗?
  • Python循环实例
  • 爬虫日常练习-selenium登录12306
  • 2022年陕西省职业院校技能大赛“网络搭建与应用”赛项竞赛试题
  • Github创建组织(organization)
  • CTF-PHP反序列化漏洞1-基础知识
  • extern 关键字
  • 「Vue面试题」Vue项目中有封装过axios吗?主要是封装哪方面的?
  • 【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
  • DHTMLX Gantt入门使用教程【引入】:如何开始使用 dhtmlxGantt
  • 51单片机和32单片机有什么区别?该从哪个开始入门学习?
  • 2023-03-18青少年软件编程(C语言)等级考试试卷(二级)解析
  • DStream是什么?怎样对DStream进行操作?
  • JS 正则匹配(RegExp)
  • UniverSeg:通用医学图像分割模型来了!