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

tcp协议下的socket函数

目录

1.socket函数

2.地址转换函数

1.字符串转in_addr的函数:​编辑

2.in_addr转字符串的函数:​编辑

1.关于inet_ntoa函数

3.listen函数

4.简单的Server模型

1.初步模型

1.sock函数和accept函数返回值的sockfd的区别

2.运行结果和127.0.0.1的意义

2.单进程模板

3.多进程模板

1.让孙子执行代码,子进程退出

2.让父进程接受到子进程退出的信号是选择忽略

4.多线程模板

5.线程池模板


1.建议先看一下udp协议:udp协议下的socket函数_udp socket函数-CSDN博客

1.socket函数

其实从上面两个区别,就能看出socket下的type使用的区别了,tcp用的是SOCK_STREM.

2.地址转换函数

1.字符串转in_addr的函数:

2.in_addr转字符串的函数:

1.关于inet_ntoa函数

inet_ntoa这个函数返回了一个char*,很显然是这个函数自己在内部给我们申请了一块内存空间,那是否需要我们自己手动释放呢?

man手册上说,inet_ntoa函数,是把这个返回值结果放到了静态存储区,这个时候就不需要我们手动释放了。但是问题来了,如果我们调用多次这个函数,会有什么样的效果呢?

运行结果:

所以我们下次应避免使用这个函数。

但是在多线程的情况下运行是没有这个情况的,理论上线程是共享内存地址空间的,那么开辟的静态空间也是重复的!但是,(我承认下面这段是copy的,哈哈哈哈)

inet_ntoa() 函数的行为依赖于实现它的库和编译器环境。在标准 C 库(如 glibc)的早期版本中,inet_ntoa() 确实返回指向内部静态缓冲区的指针,这意味着多次调用 inet_ntoa() 可能会覆盖先前的结果,特别是在多线程环境中。

然而,现代的 C 库(如 glibc 2.24 及以上版本)和编译器环境(如 GCC 和 Clang)通常会对 inet_ntoa() 进行优化,使其在多线程环境中更加安全。这些优化通常涉及使用线程局部存储(TLS)来为每个线程分配独立的缓冲区,或者在每次调用时分配一个新的栈上缓冲区。

3.listen函数

Tcp是面向连接的,服务器一般是比较“被动的”,服务器一直处于一种:一直在等待连接到来的状态。

backlog不要设置的太大,具体作用后面再讲。

4.简单的Server模型

1.初步模型

main.cc

UdpServer.hpp

1.sock函数和accept函数返回值的sockfd的区别

sock函数和accept函数的返回值都是sockfd,那么他们之间有什么区别呢?你可以把sock函数返回的sockfd当做招揽客户进入餐厅的员工,而accept返回的sockfd是具体服务进来客户的员工!

2.运行结果和127.0.0.1的意义

可以通过右边telnet来连接主机,而127.0.0.1是主机回环地址,

更详细的请看这篇博主写的:彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0 - 简书

2.单进程模板

缺点就是每次只能有一个客户进去,这样肯定不行的。

3.多进程模板

其实稍微仔细观察,就发现他其实接受不了多个客户,因为父进程需要等待还没有退出的子进程,不然会僵尸。所以有些人说那就轮询啊,但是那又要存储子进程的pid值,但是后面回收还是存在问题,还要数组存储退掉的子进程和没有退掉的子进程。

1.让孙子执行代码,子进程退出

2.让父进程接受到子进程退出的信号是选择忽略

我在这篇博客的最后面提到过。

linux信号的概念-CSDN博客

但是进程的创建是很大的,所以我们需要用线程来执行方案。

4.多线程模板

5.线程池模板

thread_pool.hpp

Linux线程池-CSDN博客

Task.hpp

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看
  • vxe-弹窗初始化激活选中Vxe-Table表格中第一行input输入框
  • debian 更新源
  • Spring Boot集成SFTP快速入门Demo
  • 独立站外链如何影响搜索引擎排名?
  • AI算法17-贝叶斯岭回归算法Bayesian Ridge Regression | BRR
  • C/C++ json库
  • 如何在电脑上演示手机上APP,远程排查移动端app问题
  • C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定
  • 入坑树莓派(2)——树莓派4B与手机蓝牙通信
  • vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口
  • 农业旅游与乡村旅游:融合绿色田野与诗意远方的经济新篇章
  • Zookeeper是什么,为什么要用,怎么用?
  • 探索数据的内在结构:使用Scikit-Learn确定聚类数
  • SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件
  • [译]如何构建服务器端web组件,为何要构建?
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • css的样式优先级
  • ES10 特性的完整指南
  • JavaWeb(学习笔记二)
  • Java到底能干嘛?
  • Laravel Telescope:优雅的应用调试工具
  • laravel with 查询列表限制条数
  • leetcode讲解--894. All Possible Full Binary Trees
  • Markdown 语法简单说明
  • Python实现BT种子转化为磁力链接【实战】
  • React-redux的原理以及使用
  • SpingCloudBus整合RabbitMQ
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue实战(四)登录/注册页的实现
  • vue总结
  • 创建一个Struts2项目maven 方式
  • 从PHP迁移至Golang - 基础篇
  • 缓存与缓冲
  • 模型微调
  • 你不可错过的前端面试题(一)
  • 批量截取pdf文件
  • 设计模式(12)迭代器模式(讲解+应用)
  • 学习JavaScript数据结构与算法 — 树
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • scrapy中间件源码分析及常用中间件大全
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # Kafka_深入探秘者(2):kafka 生产者
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #pragma once
  • #QT(智能家居界面-界面切换)
  • (笔记)M1使用hombrew安装qemu
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三)终结任务
  • (十八)SpringBoot之发送QQ邮件