[网络]tcp通信协议接口函数及一些简易项目

devtools/2024/12/22 7:40:38/

tcp是最常用的传输层协议,面向字节流,相较于其他协议,如udp;tcp更为复杂,tcp额外提供了可靠的、有序的和错误检测功能的数据传输服务.简单点来说,tcp更复杂,数据也更可靠

本文只是介绍tcp通信的一些接口,并不具体介绍tcp协议的内容以及各种策略

服务器

1.socket

int socket(int domain, int type, int protocol);// tcp协议对应的参数
int listensockfd = ::socket(AF_INET, SOCK_STREAM, 0);
  • 第一个参数domain 指定通信协议域,也就是下层的ip协议,常用有AF_INET(IPv4)、AF_INET6(IPv6)
  • 第二个参数type  指定套接字类型,SOCK_STREAM代表流式套接字,tcp是面向字节流的,所以使用这个
  • 第三个参数protocol    代表具体协议,0代表根据前两个选项自动推导,也可以设置为IPPROTO_TCP
  • 返回值      返回一个整数,代表文件描述符,在tcp里这个文件用来进行网络监听 ,此处和udp不同, 

2.bind

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// tcp协议参数
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;            // 网络层协议
local.sin_port = htons(8888);          // 绑定自己的端口号
local.sin_addr.s_addr = INADDR_ANY;    // 绑定目标的ip,服务器使用INADDR_ANY代表谁都可以访问
int n = ::bind(_listensockfd, (struct sockaddr *)&local, sizeof(local));

  • 第一个参数是前面socket 的返回值
  • 第二个参数是一个c风格的多态,tcp使用sockaddr_in*.
  • 第三个参数是第二个参数指向内容的大小
  • 返回值    成功0,失败-1

3.listen

int listen(int sockfd, int backlog);// tcp协议对应的参数
int n = ::listen(_listensockfd, 5);
  • 第一个参数是前面socket的返回值
  • 第二个参数是一个表示链接中间状态数量的整数,取决于当前服务器的性能,一般测试时给个5就可以
  • 返回值    成功0,失败-1

第二个参数的具体含义

        当调用listen后,tcp开始建立连接,但不能开始通信,直到调用accept函数,毫无疑问这一块一定是单线程的,效率较低;如果此时有大量客户端同时访问,服务器accept部分请求后,剩余的会因为长时间接收不到信息而退出。

        对于服务器来说,与其让大量客服端建立连接后傻等者,然后超时退出,不如直接一开始就不建立连接,相当于告诉他们别来了!

        listen的第二个参数代表服务器最多允许多少个客户端处于建立链接和开始通信的中间状态

4.accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// tcp协议对于的参数
struct sockaddr_in client;
socklen_t len = sizeof(client);
int sockfd = ::accept(_listensockfd, (struct sockaddr *)&client, &len);
  • 第一个参数是前面socket的返回值
  • 第二个参数是一个输出型参数,代表客户端的通信协议,ip和端口
  • 第三个参数是一个输入输出型参数(没见过吧,我也第一次见):本质是一个int*,输入时代表第二个参数的大小,输出时第二个参数被修改,代表新的第二个参数的大小
  • 返回值是一个文件描述符,用来进行网络通信

这个函数调用时会阻塞住线程,所以一般多线程的调用

客户端

1.socket(前面有,不多解释)

2.connect()

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// tcp协议对应的参数
struct sockaddr_in server;
memset(&server, 0, sizeof(server));server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = ::inet_addr(127.0.0.1);
int n = ::connect(sockfd,(struct sockaddr *)&server, sizeof(server));
  • 参数和bind差不多,但底层关系不大
  • 第一个参数是前面socket 的返回值
  • 第二个参数是一个c风格的多态,tcp使用sockaddr_in*.
  • 第三个参数是第二个参数指向内容的大小
  • 返回值是一个文件描述符,用来进行网络通信

读写

得到文件描述符后可以进行读写,客户端和服务器共用一套读写函数

最简单的方法(因为tcp面向字节流,所以直接用文件的方式)

    while(true){std::string message;std::getline(std::cin,message);write(sockfd,message.c_str(),message.size());char buffer[1024];n = read(sockfd,buffer,sizeof(buffer));buffer[n] = 0;std::cout << buffer << std::endl;}::close(sockfd);

专门的网络接口

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

个人制作的一些tcp小项目

linux/网络/2.tcp · 阿巴啊巴DDDD/计算机学 - 码云 - 开源中国

ok文章到这里结束了,如果能帮到你的话,可以给我点个赞赞吗


http://www.ppmy.cn/devtools/144310.html

相关文章

利器 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记&#xff0c;系统学习交流文末加群。 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目,通过名字我们大概也能猜出个方向&#xff0c;Crawler 是爬虫的意思&#xff0c;App 的爬虫&#xff0c;遍历 App &#xff1a; 官方 G…

游戏网站大全

http://piano.ssjjss.com/ 钢琴模拟器 https://gangqin.bmcx.com/?tdsourcetags_pcqq_aiomsg#/ 在线钢琴 https://www.gushiwen.cn/ 古诗文; https://www.bilibili.com/video/BV1UEWpeaEQK/ https://bouncyballs.org/ 掉落的球球 https://fakeupdate.net/ 假装升级界面 ht…

winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭

winform中屏蔽双击最大化或最小化窗体(C#实现)&#xff0c;禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭 protected override void WndProc(ref Message m){#region 处理点击窗体标题栏放大缩小问题&#xff0c;禁用点击窗体标题栏放大缩小//logger.Info($&…

Eclipse设置自动补全后 输入字符串类型变量后会自动追加String的解决方案

很简单&#xff0c;先打开eclipse&#xff0c;顶部找到window&#xff0c;点击preference 弹出一个设置窗口&#xff1b; 在窗口左侧选择Java>Editor>Content Assist&#xff1b;然后再右侧找到Disable insertion triggers except Enter 的选项&#xff08;禁用除Enter以…

uniapp blob格式转换为video .mp4文件使用ffmpeg工具

前言 介绍一下这三种对象使用场景 您前端一旦涉及到文件或图片上传Q到服务器&#xff0c;就势必离不了 Blob/File /base64 三种主流的类型它们之间 互转 也成了常态 Blob - FileBlob -Base64Base64 - BlobFile-Base64Base64 _ File uniapp 上传文件 现在已获取到了blob格式的…

Vue.js前端框架教程12:Vue表单验证rules和form.validate

文章目录 表单验证:rulesformRef.value.validate 表单验证 在 Vue 中&#xff0c;:rules 和 formRef.value.validate 通常用于表单验证。:rules 是一个对象&#xff0c;定义了表单字段的验证规则&#xff0c;而 formRef.value.validate 是一个方法&#xff0c;用于触发表单验证…

Android笔试面试题AI答之SQLite(3)

文章目录 11. 概述SQLite支持的编译指令(pragma) &#xff1f;12. SQLite数据库中如何进行大量的数据插入&#xff1f;13. 简述对SQLite事务的认识 &#xff1f;14. 简述SQLite升级要注意哪些地方 &#xff1f; 11. 概述SQLite支持的编译指令(pragma) &#xff1f; SQLite 支持…

【每日一题 基础题】[蓝桥杯 2020 省 AB3] 乘法表

[蓝桥杯 2020 省 AB3] 乘法表 乘法表 九九乘法表是学习乘法时必须要掌握的。在不同进制数下&#xff0c;需要不同的乘法表。 例如, 四进制下的乘法表如下所示&#xff1a; 1 * 11 2 * 12 2 * 210 3 * 13 3 * 212 3 * 321 请注意&#xff0c;乘法表中两个数相乘的顺序必须为样例…