解决该问题的整体方案不外有二:
(1)基于TCP的Socket连接;(2)基于UDP的Socket连接;
但是,针对每种方案又各有很多具体的实现方法。
在本次实验中,我先后开发了基于TCP连接和UDP连接的Socket聊天程序。具体实现思路如下:
(一) 基于TCP连接Socket聊天程序
基于该连接的聊天程序需要至少具备一个服务器端(Server)和一个客户端(Client)。在本程序中,一个用户作为Server端,另一个用户作为Client端。也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。当TCP连接握手以后,双方方可进行交互。(注:在本程序中Server端并不是单独存在。它也可以向他的Client端发送消息。)但是本程序实现的交互功能十分简单,具有很多限制。当Client端与Server端握手以后,Server端需要首先发起会话;Client端在收到消息后再回复一条消息给Server端;同样,Server端在收到消息后再回复一条消息给Client端……以此类推。并且,无论是Server端还是Client端每次发送消息只能发送一条。
造成交互操作具有诸多限制的主要原因是,我在Server端和Client端使用了一个While循环,它们的伪代码分别如下:
Client端
|
Server端
|
while(TRUE)
{
从Server端接收消息
{
…
}
向Server端发送消息
{
…
}
}
|
while(TRUE)
{
向Client端发送消息
{
…
}
从Client端接收消息
{
…
}
}
|
(二) 基于UDP连接Socket聊天程序
基于该连接的聊天程序不需要具备服务器端(Server),每个客户端(Client)既是服务器端也是客户端。也就是说每个Client端自身既可以自行接收其它用户发来的消息,也可以向其它Client端发送消息,不需要事先与其他用户进行握手连接。
由于在默认情况下WinSock接口的recvfrom()和sendto()都会在被调用时阻塞当前线程,也就是说如果程序正在接受其他用户发来的数据,那么它就不能够执行发送数据的任务,反之相同。所以为解决该问题一般有以下几种解决方案:采用Select模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠(Overlapped)模型和完成接口(Completion port)模型。在本程序中,由于我没能在短时间内学会上述方案中的任一种,因此采用了多线程技术去实现消息接收和发送的同步问题。也就是说,在程序中创建两个线程,一个线程负责发送消息,另一个消息负责接受消息。两个线程交替运行,从而达到同时收发消息的目的。当然采用多线程方式解决消息收发同步问题可以移除上个程序中每个用户一次只能发送一条消息的限制。
|
相关推荐
使用C/C++实现Socket聊天程序,本程序采用C++编写。具有良好的重用性。为初学者提供了一个很好的范例
用C/C++实现Socket聊天程序 包括客户端和服务端
使用C_C++实现Socket聊天程序 聊天程序源代码在一个册子里面 方便好用 详细
C++实现自助点餐系统源码+实验报告+文档说明(95分以上大作业项目).zip 该项目是个人大作业项目源码,评审分达到95分以上,都经过严格调试,确保可以运行!放心下载使用。 C++实现自助点餐系统源码+实验报告+文档...
操作系统文件复制实验C++源码(含代码注释+实验报告).zip操作系统文件复制实验C++源码(含代码注释+实验报告).zip操作系统文件复制实验C++源码(含代码注释+实验报告).zip操作系统文件复制实验C++源码(含代码注释+实验...
c++学生成绩管理系统源代码+实验报告, 文件读写、班级创建、添加学生、修改学生信息、等等
由于该技术需要直接读写对内存中的机器码,所以多采用汇编语言实现,这使得很多想在自己的程序中使用SMC技术进行软件加密的C/C++程序员望而却步。针对这种现状,本文提出了几种基于C/C++语言的机器指令定位方法,...
聊天程序 c/C++ 经典中的经典程序代码 聊天程序 c/C++ 经典中的经典程序代码 聊天程序 c/C++ 经典中的经典程序代码
数据结构课设基于C++的交通咨询系统源码+实验报告+代码注释.zip数据结构课设基于C++的交通咨询系统源码+实验报告+代码注释.zip数据结构课设基于C++的交通咨询系统源码+实验报告+代码注释.zip 该项目是个人课设项目,...
数据结构课设基于C++的图书管理系统源码+实验报告+代码注释.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信...
1.源代码未经任何封装,逻辑清晰,简洁明了 2.使用MFC进行界面编程 3.服务器端有windows版和LInux版 4.压缩包中已存在我编译好的软件,可直接使用 5.项目由VS2022建立,如果使用低版本的VS请自行设置一些选项 6.代码...
操作系统实验一报告【使用C语言/C++实现时间片轮转调度算法】
C语言/C++基础之跨年烟花代码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福
C++编写的Socket聊天程序源代码,程序所在文件夹名:TCP聊天服务器端 ;TCP聊天客户端
c++基于socket聊天程序 简单 方便
C语言/C++基础之跨年烟花代码,适合初学C语言/C++的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学C语言/C++ 程序设计的小伙伴们,你们的成长是我最大的幸福
c/c++ 猜数字 游戏 程序代码 c/c++ 猜数字 程序代码 ,通过这个代码程序,你可以输入四个数字,通过一定的猜测,得出正确的数字序列。代码中还有特权模式。你输入密码后,可以得到更准确的提示!!做报告之代码救急...
但由于之前我设计文法大多只是为了测试使用,所以文法很不规范,这直接导致了语义子程序十分难实现,所以要想实现一个好的语义分析器,必须先设计好你的文法。 需要注意的是,这个语义分析器是建立在我之前写的语法...