2024/3/17 TCP的进程和线程通信,模拟面试总结

#include<myhead.h>
#define SER_PORT 8888//服务器端口号
#define SER_IP "192.168.65.130"//服务器IP
//定义向线程体提供参数的结构体
struct BufInfo
{int newfd;struct sockaddr_in cin;
};
//定义线程体函数
void *deal_cli_msg(void *arg)
{//接受传过来的消息int newfd = ((struct BufInfo*)arg)->newfd;struct sockaddr_in cin = ((struct BufInfo*)arg)->cin;//收发数据char sbuf[128] = "";while(1){//将容器清空bzero(sbuf,sizeof(sbuf));int res = recv(newfd,sbuf,sizeof(sbuf)-1,0);if(res == 0){printf("客户端已经下线\n");break;}printf("[%s  %d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),sbuf);strcat(sbuf,">_<");send(newfd,sbuf,strlen(sbuf),0);printf("发送成功\n");}//关闭与客户端通信的套接字close(newfd);//退出线程pthread_exit(NULL);
}/************主程序***************/
int main(int argc, char *argv[])
{//创建一个套接字int sfd = -1;sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error\n");return -1;}printf("%d success sfd = %d\n",__LINE__,sfd);//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &reuse, sizeof(reuse)) ==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);//绑定IP地址和端口号if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("bind error\n");return -1;}printf("%d 绑定成功\n",__LINE__);//开启被动监听状态if(listen(sfd,128)==-1){perror("listen error\n");return -1;}printf("%d 开启被动监听状态成功\n",__LINE__);//阻塞等待客户端的连接请求int newfd = -1;struct sockaddr_in cin;socklen_t adderlen = sizeof(cin);pthread_t tid = -1;while(1){if((newfd=accept(sfd,(struct sockaddr *)&cin,&adderlen))==-1){perror("accept error\n");return -1;}printf("[%s  %d]:发来连接请求 newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);struct BufInfo buf;buf.newfd = newfd;buf.cin = cin;//创建子线程用于处理通信客户端if(pthread_create(&tid,NULL,deal_cli_msg,&buf) != 0){printf("pthread_create error");return -1;}//回收分支线程的资源pthread_detach(tid);}close(sfd);return 0;
}
#include<myhead.h>
#define SER_PORT 8888//服务器端口号
#define SER_IP "192.168.65.129"//服务器IP
//定义一个信号处理函数
void handler(int signo)
{if(signo == SIGCHLD){while(1){if(waitpid(-1,NULL,WNOHANG)==0){break;}}}
}//************主程序**************
int main(int argc, char *argv[])
{//调用信号处理函数if(signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}//创建一个套接字int sfd = -1;sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error\n");return -1;}printf("套接字创建成功\n");printf("%d sfd = %d\n",__LINE__,sfd);//最小未分配原则//端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &reuse, sizeof(reuse)) ==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);//绑定IP地址和端口号if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("bind error\n");return -1;}printf("%d 绑定成功\n",__LINE__);//开启被动监听状态if(listen(sfd,128)==-1){perror("listen error\n");return -1;}printf("被动监听状态开启成功\n");//阻塞等待客户端的连接请求int newfd = -1;struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);//定义进程号变量pid_t pid = -1;while(1){	   if((newfd = accept(sfd,(struct sockaddr *)&cin,&addrlen))==-1){perror("accept error\n");return -1;}printf("[%s  %d]:发来连接请求 newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);//创建子进程pid = fork();if(pid > 0){close(newfd);        }else if(pid == 0){close(sfd);//收发数据char rbuf[128]="";while(1){//将容器清空bzero(rbuf,sizeof(rbuf));//向套接字中读取数据int res = recv(newfd,rbuf,sizeof(rbuf)-1,0);if(res == 0){printf("客户端已下线\n");break;}printf("[%s  %d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);//加个笑脸还回去strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}//关闭服务器通信的套接字close(newfd);//退出子进程exit(EXIT_SUCCESS);}}//关闭服务器close(sfd);return 0;}

模拟面试总结:

什么是IP地址?

IP地址是主机在网络中的唯一标识(也是路由器选择的唯一标识),当主机从一个网络切换到另一个网络时,他会更改IP地址。

IP地址也分为IPv4和IPv6,IP地址一般由网络号和主机号组成。

IP地址和MAC地址的区别?

IP地址不一定是计算机的唯一标识,随着网络的切换,IP地址会发生更改,但是MAC地址不会发生更改。

MAC地址是计算机厂商给的唯一标识,全球唯一。

什么是端口号?

端口号是计算机用来区分同一主机上的多个进程而引入的,是一个两字节的无符号整数,也是网络通信中两个决定性因素之一。同时端口号分为三类:系统指定端口号,用户可用端口号,自动分配端口号。

TCP通信中的服务器实现流程?

通过socket创建一个套接字用于后续的通信,再通过bind函数来绑定服务器的IP地址和端口号并通过listen函数开启监听效果,之后通过accept函数实现与客户端的连接,后续便可以使用recv/send函数实现与客户端的数据交换过程,完成交换数据后可通过close函数关闭套接字。

TCP通信中的客户端实现流程 ?

通过socket创建一个套接字用于后续的通信,再通过bind函数来绑定客户端的IP地址和端口号并通过listen函数开启监听效果,之后通过connect函数实现与服务器的连接,后续便可以使用recv/send函数实现数据交换过程,完成交换数据后可通过close函数关闭套接字。

TCP和UDP的区别?

TCP ----> 稳定

1> 提供面向连接的,可靠的数据传输服务

2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复

1、TCP会给每个数据包编上编号,该编号称之为序列号

2、每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止

3> 数据传输效率低,耗费资源多

4> 数据收发是不同步的

1、为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象

2、该沾包算法称之为Nagle算法

5> TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议

例如:账户登录,大型文件下载的时候

UDP ----> 快速

1> 面向无连接的,不保证数据可靠的,尽最大努力传输的协议

2> 数据传输过程中,可能出现数据丢失、重复、失序现象

3> 数据传输效率高,实时性高

4> 限制每次传输的数据大小,多出部分直接忽略删除

5> 收发是同步的,不会沾包

6> 适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下

例如:广播、通讯软件的音视频

TCP通信中的三次握手四次挥手?

UDP中是否可以使用connect函数进行连接?

1> udp通信中可以使用connect函数,他是将服务器与某个客户端建立一个唯一通道

2> 好处:传输效率高,稳定性高,数据干扰较小

3> 在服务器端使用connect与某个特定的客户端建立连接后,服务器就不再接收其他客户端的消息了

4> 如果想要断开,需要再使用一次connect函数,但是需要将地址信息结构体中的sin_addr改成AF_UNSPEC

5> 在udp中可以多次使用connect函数与其他客户端建立连接,但是在TCP中只能进行一次连接

6> 当UDP中使用了connect与某个特定的客户端建立连接后,就可以正常使用read/write、send/recv函数完成通信
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/PC12581/article/details/136768190

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初次文件包含漏洞

1.文件包含漏洞介绍 1.1.文件包含漏洞解释   文件包含漏洞就是使用函数去包含任意文件的时候&#xff0c;当包含的文件来源过滤不严谨的时候&#xff0c;当存在包含恶意文件后&#xff0c;就可以通过这个恶意的文件来达到相应的目的。 1.2.文件包含漏洞原理    其实原理就…

四、MySQL

MySQL MySQL1.初识网站2.安装MySQL2.1 下载&#xff08;最重要的一点是路径中不能有中文&#xff0c;哪怕是同级目录也不行&#xff09;2.2安装补丁2.3安装2.4创建配置文件2.5初始化 3.启动MySQL4.连接测试4.1 设置密码4.2 查看已有的文件夹&#xff08;数据库&#xff09;4.3 …

Linux怎么查看当前进程?怎么执行退出?怎么查看当前路径?

在Linux系统中&#xff0c;查看当前进程、执行退出和查看当前路径都可以通过命令行来完成。下面是具体的命令和它们的用法&#xff1a; 1. **查看当前进程**&#xff1a; 使用ps命令可以查看当前运行的进程。ps代表“process status”&#xff0c;它可以显示当前用户的进程…

计算机网络——物理层(信道复用技术)

计算机网络——物理层&#xff08;信道复用技术&#xff09; 信道复用技术频分多址与时分多址 频分复用 FDM (Frequency Division Multiplexing)时分复用 TDM (Time Division Multiplexing)统计时分复用 STDM (Statistic TDM)波分复用码分复用 我们今天接着来看信道复用技术&am…

用Excel就可以实现的生产绩效考核评定

从事生产管理数十载&#xff0c;在进行员工日常生产效率和综合考核的管理方面&#xff0c;积累了一些经验和注意事项。今天来和大家分享一下如何用Excel来搞定它吧&#xff01; 首先&#xff0c;Excel是一个强大的工具&#xff0c;可以帮助我们收集、分析和展示员工的生产数据…

掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)

在Go语言中&#xff0c;字典通常指的是map类型&#xff0c;它是一种用于存储键值对的数据结构。字典在Go中非常常见&#xff0c;是一种高效的数据结构&#xff0c;用于快速查找和检索数据。 字典的详细使用方法 创建字典 可以使用make函数来创建字典&#xff0c;并指定键值对…

生成器建造者模式(Builder)——创建型模式

生成器/建造者模式——创建型模式 什么是生成器模式&#xff1f; 生成器模式是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 提炼两个关键点&#xff1a;Ⅰ.分步骤创建复杂对象。Ⅱ.相同创建代码…

llm综述

1、语言模型进程 1.1、语言模型概述 语言模型从统计语言模型&#xff08;SLM&#xff09;逐步发展为神经语言模型&#xff08;NLM&#xff09;&#xff1b;近年&#xff0c;通过在大规模语料库上对 Transformer 模型进行预训练&#xff0c;预训练语言模型(Pre-training Langu…

Windows程序员用MAC:安装win双系统、wintogo和删除

初级代码游戏的专栏介绍与文章目录-CSDN博客 这是本人用mac的操作记录&#xff0c;型号为MBP2019(intel CPU)。 大部分操作是基于较早的MAC系统&#xff08;大约是2021年年底到2022年年初&#xff09;&#xff0c;提及的“新版”是2023年年初。这篇文章的目的不是让你照着做就能…

面试经典-29- 插入区间

题目 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;intervals …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:EffectComponent)

特效合并容器组件&#xff0c;用于子节点特效绘制的合并&#xff0c;实现特效的绘制性能优化。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。 目前该组件仅支持子组件背景…

亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具

3月16日&#xff0c;2024百度Create AI开发者大会正式开放售票&#xff0c;嘉宾套票定价399元。据悉&#xff0c;本次大会以“创造未来&#xff08;Create the Future&#xff09;”为主题&#xff0c;设有20深度论坛、超30节AI公开课、3000平AI互动体验区和AI音乐节等精彩环节…

基于java+springboot+vue实现的网上商城系统(文末源码+Lw+ppt)23-448

摘要 随着社会的不断进步与发展&#xff0c;人们经济水平也不断的提高&#xff0c;于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来&#xff0c;利用计算机网络来处理各行业事务这一概念更深入人心&#xff0c;由于用户工作繁忙的原因&#xff0c;去商城购…

WIFI攻击方法总结

WIFI攻击是指黑客利用各种手段&#xff0c;对WIFI网络进行非法入侵和攻击&#xff0c;以获取用户的个人信息、网络权限或其他敏感数据。常见的WIFI攻击方式主要包括以下几种&#xff1a; 伪造认证页面&#xff1a;黑客可以创建一个伪造的认证页面&#xff0c;当用户尝试连接到…

深圳市翻译协会与赛氪网签署战略合作协议 共推语言服务行业创新发展

2024年3月12日&#xff0c;在中国深圳&#xff0c;深圳市翻译协会与赛氪网共同举办了一场盛大的战略合作签约仪式&#xff0c;标志着双方在语言服务行业将展开深度合作&#xff0c;共同推动行业的创新与发展。 签约仪式上&#xff0c;深圳市翻译协会向赛氪网赠送了《汉英深圳公…

pinia 的选项式和组合式的不同写法和持久化的方法

pinia 是vue3推荐的状态管理插件&#xff0c;它对标的是vue2中使用的vuex pinia 的引入方法 npm 安装 pinia在 src/store/index.js 中 创建一个pinia 的实例&#xff0c;并导出 在项目中的 main.js 中引入 2 中的pinia 并且使用 app.use(pinia) main.js中 import pinia from…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛—— C 题:竞赛论文的辅助自动评阅完整思路与源代码分享

一、问题背景 近年来我国各领域各层次学科竞赛百花齐放&#xff0c;层出不穷&#xff0c;学生参与度也越来越高。随着参赛队伍的增 加&#xff0c;评阅论文的工作量急剧增加&#xff0c;这对评阅论文的人力要求也越来越大。因此引入机器辅助评阅成为竞赛主办方的现实需求。 在…

docker linux 时序不一致 timezone localtime解决方案 一秒钟

问题描述: 启动 apscheduler 报错如下: <ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div>…

【论文笔记合集】Transformers in Time Series A Survey综述总结

本文作者&#xff1a; slience_me 文章目录 Transformers in Time Series A Survey综述总结1 Introduction2 Transformer的组成Preliminaries of the Transformer2.1 Vanilla Transformer2.2 输入编码和位置编码 Input Encoding and Positional Encoding绝对位置编码 Absolute …

Java Spring Boot搭配MyBatis的项目开发中关于账户余额并发更新

在Java Spring Boot搭配MyBatis的项目开发中&#xff0c;涉及到多个功能模块同时操作同一数据库表字段&#xff08;例如用户账户余额&#xff09;时&#xff0c;为了保证数据的一致性和防止更新过程中的错误&#xff08;例如余额错账、更新丢失等&#xff09;&#xff0c;需要采…