嵌入式linux项目介绍与分享-基于 Linux 下 Socket 网络编程的局域网聊天室_linux项目局域网聊天室-程序员宅基地

技术标签: stm32  嵌入式linux学习  笔记  网络  arm开发  linux  

  • 以下是项目的介绍和面试官可能会提出来的问题,项目代码免费分享,关注我后私信我发项目代码。

  • 项目介绍

    • 本项目是基于 Linux 下 Socket 网络编程的局域网聊天室,实现了账号注册与登录、私聊消息、群发消息、发送离线消息、查看聊天记录、修改昵称密码等功能,并设置管 理员,实现将用户禁言、解禁、踢出聊天室等,采用多线程并发服务器模型处理多个客户端的同时连接和请求,服务器创建并管理用户数据、在线用户数据、聊天数据、离线消息数据等 SQlite 数据库,并提供后台服务,客户端通过 TCP 协议建立与服务器的稳定连接,并通过格式化输入输出实现与用户的交互,使用 Makefile 工具实现项目代码的自动化编译和链接

  • 项目创新点

    • 多线程并发服务器模型:通过使用多线程,服务器可以同时处理多个客户端的连接和请求,提高了系统的并发性能。

    • SQLite 数据库管理:服务器使用 SQLite 数据库来存储用户数据、在线用户数据、聊天记录和离线消息,实现了数据的持久化和高效查询

  • 项目困难,怎么解决

    • 主要还是对于数据库的读写,因为程序写的有问题经常需要修改程序,还有就是会面临多个客户端同时访问一个数据库会出现冲突的问题。

  • 项目用到哪些技术

    • 编程语言:C/C++

    • 网络编程:Socket 编程

    • 并发模型:多线程

    • 数据库:SQLite

    • 编译工具:Makefile

把这个项目写进简历面试官可能会问的问题

  • 多线程并发服务器模型

    • 核心思想是利用多线程技术,使得服务器能够同时处理多个客户端的连接和请求,从而提高了服务器的并发处理能力和响应速度。

    • 当一个新的客户端连接请求到达时,服务器会创建一个新的线程来处理该连接。这个新线程会负责与该客户端进行通信,接收其发送的请求,并执行相应的操作或返回响应。同时,其他已经存在的线程则可以继续处理其他客户端的请求,互不干扰。

  • SQlite 数据库

    • SQLite是一个轻量级的关系型数据库管理系统,具有零配置、自包含的特点,适用于嵌入式系统和移动应用等场景。

    • SQLite的轻量级、无服务器、基于文件存储等特点

  • TCP编程是什么

    • 指使用TCP(传输控制协议)进行网络通信的编程方式

    • TCP是一种可靠的、面向连接的协议

  • TCP和UDP的区别是什么

    • TCP是面向连接的,UDP是面向无连接的

    • UDP程序结构简单

    • TCP是面向字节流的,UDP是基于数据包的

    • TCP保证数据的正确性,UDP可能会数据丢失

  • TCP的通信过程

    • 建立连接:三次握手

      • 客户端收到应答后,再发送一个应答报文段,其中包含ACK标志位,同时客户端发送一个随机数Z

      • 服务器收到请求后,如果同意连接,则发送一个应答报文段,其中包含SYN和ACK(确认)标志位,同时服务器发送一个随机数Y

      • 客户端向服务器发送连接请求报文段,其中包含SYN(同步)标志位,同时客户端发送一个随机数X

    • 数据传输

    • 断开连接:四次挥手

      • 客户端收到应答后,再发送一个应答报文段,确认断开请求

      • 服务器发送一个FIN(结束)报文段,请求断开连接

      • 服务器收到请求后,发送一个应答报文段,确认断开请求

      • 客户端发送一个FIN(结束)报文段,请求断开连接

  • 为什么使用TCP而不使用UDP

    • TCP可靠,体现在TCP在传输数据之前,会有三次握手来建立连接,在传输数据时,有确认、窗口、重传等控制机制,在数据传输后还会断开连接用来节约系统资源

  • socket流程

    • 服务器

      • 调用 socket()函数创建套接字

      • 调用 bind()函数将套接字与一个端口号以及 IP 地址进行绑定

      • 调用 listen()函数让服务器进程进入监听状态,监听客户端的连接请求

      • 调用 accept()函数处理到来的连接请求

      • 调用send()和recv()函数分别发送和接收数据

      • 调用close()函数关闭Socket对象,释放相关资源

    • 客户端

      • 调用 socket()函数创建套接字

      • 设置需要连接服务器的 IP 地址和端口

      • 使用 connect()连接服务器

      • 调用send()和recv()函数分别发送和接收数据

      • 调用close()函数关闭Socket对象,释放相关资源

  • 描述你的数据库模式和表结构

    • 用户数据

      • name:用户名

      • id:用户 ID

      • password:密码

    • 在线用户数据

      • name:用户名

      • cfd:用户文件描述符

      • flag:用户标志位

    • 聊天数据

      • name:发送用户

      • toname:接收用户

      • msg:消息结构体

    • 离线消息数据

      • name:发送用户

      • toname:接收用户

      • msg:消息结构体

  • 管理员权限是如何验证的

    • 这个其实很简单,管理员我命名为admin,只要是这个用户名登录就是进入管理员模式。

  • 你是如何实现账号注册与登录功能的

    • 用户在注册时提供用户名和密码,程序会随机生成一个十位数的ID,将用户名,密码和ID都存储在 SQLite 数据库中。在登录时,用户输入可以选择是使用用户名登录还是密码登录,然后用户输入用户名或者ID其次输入密码,服务器验证这些凭据是否匹配数据库中的记录。

  • 如何实现多线程并发服务器模型的

    • 服务器初始化

      • 创建一个服务器套接字(Socket)并绑定到指定的 IP 地址和端口。

      • 监听连接请求,等待客户端连接。

    • 客户端连接处理

      • 当客户端连接时,服务器接受连接请求并创建一个新的线程来处理该客户端。

      • 每个客户端连接都有一个独立的线程,负责与该客户端通信。

  • 进程间通信方式有哪些

    • 管道

      • 普通管道:单工通信,只能父子或兄弟进程间使用

      • 流管道:半双工通信,只能父子或兄弟进程间使用

      • 有名管道:双工通信,并且允许没有关系的进程间使用

    • 信号:信号用于通知接收信号的进程有某种事件发生,所以可用于进程间通信;除了用于进程间通信之外,进程还可以发送信号给进程本身

    • 消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。

    • 信号量:信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问

    • 共享内存:共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程都可以访问,使得多个进程可以访问同一块内存空间。

    • 套接字(Socket):基于网络的 IPC 方法,允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据,就是网络通信

以上是项目的介绍和面试官可能会提出来的问题,项目代码免费分享,关注我后私信我发项目代码。

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

智能推荐

数据类型转换问题-程序员宅基地

文章浏览阅读343次,点赞9次,收藏10次。使用函数tolist()之后数据发生变化,从小数点后4位变成小数点后16位,如何才能让数据不变化?list:包含3608个[128,100]的张量。使用for循环将张量都转化成二维数组列表。

element中表单错误提示信息被遮盖_el-form-item_error文字过长-程序员宅基地

文章浏览阅读5.9k次。提示信息被遮盖解决方法  可以给form-item加一个特定的class,不影响其他的提示框,然后设定width,可以把所有内容显示。代码vue的template代码<el-form-item label="用户微信" prop="userWeChat" class="weixinError"> <el-input v-model="userInfo.userWeChat" maxlength="20"></el_el-form-item_error文字过长

sqlmap安装以及运用_kali安装sqlmap-程序员宅基地

文章浏览阅读1.7k次。sqlmap是一个开源的渗透测试工具,它可以自动化检测sql注入漏洞利用sql注入缺陷 接管数据库服务器。_kali安装sqlmap

【曼哈顿距离】第六届蓝桥杯省赛C++ B组 /JAVA A组C组《移动距离》(c++)_移动距离 蓝桥杯 c++-程序员宅基地

文章浏览阅读598次,点赞19次,收藏4次。本题来自第六届蓝桥杯省赛C++ B组 /JAVA A组C组《移动距离》_移动距离 蓝桥杯 c++

zram disksize 设置_use_dedup-程序员宅基地

文章浏览阅读3.4k次。zram disksize 设置小内存项目:1G,2G,3G RAMzram disksize设置.高通:高通的设置比较简单:相关代码:init.qcom.post_boot.shif [ -f /sys/block/zram0/disksize ]; thenif [ -f /sys/block/zram0/use_dedup ]; thenecho 1 > /sys/block/zram0/use_dedupfiif [ $MemTotal -le5242_use_dedup

学画画软件app推荐_在游戏中学习!化学app软件推荐!-程序员宅基地

文章浏览阅读281次。今天中学化学园给大家推荐几款超有趣的教育软件APP,大家可以自行搜索下载,又萌又有趣,在玩乐中还能学到知识!手机要有足够内存哦~~~!下面几款适用于苹果系统~~~1.神奇的化学元素简介:可以高效帮助您记忆有关元素的基本知识。适用对象:初高中学生2.烧杯简介:150多种药剂、300多种神奇的化学反应任你尝试。安全、有趣生动、随时随地做各种化学实验,生动直观,充满乐趣~适用对象:高中学生锂..._化学游戏软件

随便推点

matlab文件路径操作 mfilename_matlab里面打开文件找不到main-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏20次。很多时候我们需要把代码发给别人,而运行的代码可能包含路径。例如,你在你的电脑上需要加载一个mat文件,你的代码中包含了这个mat文件的具体的路径。例如,load('C:\Users\ncf\Desktop\计算机视觉大作业\program\xixi.mat'),当你把这个代码文件夹压缩发给别人时,别人一运行就会报错,这时我们需要自动识别,mat文件的路径。mfilename函数可以返回当前..._matlab里面打开文件找不到main

ssm+jsp计算机毕业设计职业高中学情成绩系统ci2a1(程序+lw+源码+远程部署)-程序员宅基地

文章浏览阅读22次。Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。2. 前端:L ayui+css+javascript+jQuery+ElemenUI+highcharts。SSM + mybatis + Maven + JSP 等等组成,B/S模式 + Maven管理等等。2. 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目;

Windows命令行(CMD/Powershell)下载文件的命令_windows 命令提示符下载网页文件命令-程序员宅基地

文章浏览阅读733次,点赞3次,收藏8次。Windows命令行下载文件的方法_windows 命令提示符下载网页文件命令

渗透测试-安服面试点总结_安服题-程序员宅基地

文章浏览阅读1.5k次。渗透测试-安服面试点总结_安服题

C语言文件操作与调试技巧:编辑、运行和测试你的项目_c语言编辑-程序员宅基地

文章浏览阅读424次。错误类型判断 在C语言中,常见的错误类型包括语法错误、逻辑错误和运行时错误。逻辑错误是指程序的逻辑错误,导致程序的输出不符合预期。运行时错误是指在程序运行过程中发生的错误,例如除以零、访问不存在的内存等。通过本文的介绍,你已经了解了在C语言项目中打开文件、编辑、运行和测试程序的基本方法,以及常见的错误类型判断和调试技巧。同时,持续学习和实践是提高编程技能的关键,希望本文能为你在C语言编程之路上提供帮助和指导。此外,还将探讨常见的错误类型判断和程序测试方法,帮助你提高代码质量和开发效率。_c语言编辑

【代码优化】for-each代替普通的for循环或者while循环_c++中的while循环可有什么替代-程序员宅基地

文章浏览阅读2.8k次。对于集合的遍历首选方法是for-eachfor(Element e :c){ doSomething(e);}这是1.5版本之后的做法;java1.5之前使用的是Iterator迭代器。为了弄清楚为啥比普通的for循环或者whlie循环好,请看一下代码Iterator i=c.iterator();while(i.hasNext()){_c++中的while循环可有什么替代

推荐文章

热门文章

相关标签