使用CC实现Socket聊天程序计算机C资料计算机C++资料.pdf
《使用CC实现Socket聊天程序计算机C资料计算机C++资料.pdf》由会员分享,可在线阅读,更多相关《使用CC实现Socket聊天程序计算机C资料计算机C++资料.pdf(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、使用 C/C+实现 Socket 聊天程序 Initsock.h 文件/initsock.h 文件#include#include#include#include#pragma comment(lib,WS2_32/链接到 WS2_32.lib class CInitSock public:CInitSock(BYTE minorVer=2,BYTE majorVer=2 /初始化 WS2_32.dll WSADATA wsaData。WORD sockV ersion=MAKEWORD(minorVer,majorVer。if(:WSAStartup(sockV ersion,&wsaDat
2、a!=0 exit(0。CInitSock(:WSACleanup(。TCP 版 TCPClient.cpp 文件/TCPClient.cpp 文件/*使用说明 0.运行程序前请查看是否将 initsock.h 文件引入到项目中。1 首先修改聊天对方的 IP 地址 2 请首先运行服务端TCPServer)程序,再运行客户端 TCPCIient)程序:如配置正确服务端会收到相关连接信息。3 连接成功后,需要由服务器端首先发起会话 输入消息并确认发送),客户端收到消息后才能输入消息并确认发送到服务器端。并且双方每次只能发送一条消息。如想发送第二条消息,需要等待该方成功 接受到另一方的消息后才能继续
3、输入消息。*/#in elude In itSock.h#in clude#include CInitSock initSock。/初始化 Winsock 库 int main(/创建套节字 SOCKET s=:socket(AF_INET,SOCK_STREAM,IPPROTO_TCP。if(s=INV ALID_SOCKET printf(Failed socket(n。return 0。/也可以在这里调用 bind 函数绑定一个本地地址/否则系统将会自动安排/填写远程地址信息 sockaddr_in servAddr。servAddr.sin_family=AF_INET。servAdd
4、r.sin_port=htons(4567。/注意,这里要填写服务器程序 。if(:connect(s,(sockaddr*&servAddr,sizeof(servAddr=-1 printf(Failed connect(n。return 0。char buff256。char szText256。while(TRUE /从服务器端接收数据 int nRecv=:recv(s,buff,256,0。if(nRecv 0 buffnRecv=0。printf(接收到数据:%sn,buff。/向服务器端发送数据 cinszText。szText255=0。:send(s,szText,strl
5、en(szText,0。附近时将可能出现什么情况答过量继电器的继电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器可靠工作其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电
6、流或电压不变的情况下电磁力矩随/关闭套节字:closesocket(s。return 0。TCPServer.cpp 文件/TCPServer.cpp 文件/*使用说明 0.运行程序前请查看是否将 initsock.h 文件引入到项目中。1.首先修改聊天对方的 IP 地址 2.请首先运行服务端TCPServer)程序,再运行客户端 TCPCIient)程序:如配置正确服务端会收到相关连接信息。3.连接成功后,需要由服务器端首先发起会话 输入消息并确认发送),客户端收到消息后才能输入消息并确认发送到服务器端。并且双方每次只能发送一条消息。如想发送第二条消息,需要等待该方成功 接受到另一方的消息后
7、才能继续输入消息。*/#incIude InitSock.h#incIude#incIude Clni tSock ini tSock。/初始化 Win sock 库 int main(/创建套节字 SOCKET sListen=:socket(AF_INET,SOCK_STREAM,IPPROTO_TCP。if(sListen=INV ALID_SOCKET printf(FaiIed socket(n。return 0。/填充 sockaddr_in结构 sockaddr_in sin。sin.sin_famiIy=AF_INET。sin.sin_port=htons(4567。sin.s
8、in_addr.S_un.S_addr=INADDR_ANY。/绑定这个套节字到一个本地地址 if(:bind(sListen,(LPSOCKADDR&sin,sizeof(sin=SOCKET_ERROR printf(FaiIed bind(n。return 0。/进入监听模式 附近时将可能出现什么情况答过量继电器的继电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器可靠工作其动作特性必须
9、满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随if(:Iisten(sListen,2=SOCKET_ERROR printf(FaiIed Iisten(n。return 0。/循环接受客户的连接请求 sockaddr_in remoteAddr。int nAddrLen=sizeof(remoteAddr。SOCKET sClient=0。char
10、szText=TCP Server Demo!rn。while(sClient=0 /接受一个新连接 sClient=:accept(sListen,(SOCKADDR*&remoteAddr,&nAddrLen if(sClient=INV ALID_SOCKET printf(Failed accept(。printf(接受到一个连接:%s rn,inet_ntoa(remoteAddr.sin_addr。continue。while(TRUE /向客户端发送数据 gets(szText。:send(sClient,szText,strlen(szText,0。/从客户端接收数据 char
11、 buff256。int nRecv=:recv(sClient,buff,256,0。if(nRecv 0 buffnRecv=0。printf(接收到数据:%sn,buff。/关闭同客户端的连接:closesocket(sClient。/关闭监听套节字:closesocket(sListen。return 0。附近时将可能出现什么情况答过量继电器的继电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了
12、保证继电器可靠工作其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随UDP 版/Chat.cpp:Defines the entry point for the console application./*使用说明 0.运行程序前请查看是否将 initsock.h 文件引入到项目中。1 首先修改聊天对方的 IP 地址 2.运行程序:如配置正确另
13、一方会收到相关连接信息。3.输入消息:在每次输入完欲发送的消息后,需要连续敲击两次回车。4.本程序有诸多缺陷:对用户输入的消息不能即时回显到控制台,需要在敲击两次回车后回显到屏幕。*/#include stdafx.h#include#include#include#include#include InitSock.h using namespace std。CInitSock initSock。/初始化 Winsock 库 DWORD receiverMark。/接收消息者线程标识符 DWORD senderMark。/发送者线程标识符/*定义信号量*/DWORD WINAPI Receiv
14、er(LPVOID。DWORD WINAPI Sender(LPVOID。/接收数据 char buff1024。sockaddr_in addr。int nLen=sizeof(addr。SOCKET s。int main(int argc,char*argv /创建套节字 s=:socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP。/u_long iMode=1。/ioctlsocket(s,FIONBIO,&iMode。if(s=INV ALID_SOCKET printf(Failed socket(n。return 0。附近时将可能出现什么情况答过量继电器的继电
15、特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器可靠工作其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随/填充 sockaddr_in 结构
16、 sockaddr_in sin。sin.sin_family=AF_INET。sin.sin_port=htons(4567。sin.sin_addr.S_un.S_addr=INADDR_ANY。addr.sin_family=AF_INET。addr.sin_port=htons(4567。附近时将可能出现什么情况答过量继电器的继电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器可靠工作
17、其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随/注意,这里要填写服务器程序所在机器的 IP 地址/如果你的计算机没有联网,直接使用 127.0.0.1 即可 addr.sin_addr.S_un.S_addr=inet_addr(192.168.1.129。/绑定这个套节字到一个本地地址 if(:bind(s,(LPSOCKADDR&sin
18、,sizeof(sin=SOCKET_ERROR printf(Failed bind(n。return 0。/发送数据 char szText=PC 请求连接.rn。:sendto(s,szText,strlen(szText,0,(sockaddr*&addr,sizeof(addr。CreateThread(NULL,0,Receiver,NULL,0,&receiverMark。CreateThread(NULL,0,Sender,NULL,0,&senderMark。bool isContinue=true。while(isContinue if(getche(=96/按 后终止程序
19、运行 isContinue=false。system(PAUSE。return 0。/*接收者*/DWORD WINAPI Receiver(LPVOID lpParam while(1 int nRecv=:recvfrom(s,buff,1024,0,(sockaddr*&addr,&nLen。if(nRecv 0 buffnRecv=0。printf(Received data(%s:%sn,:inet_ntoa(addr.sin_addr,buff。return 0。/*发送者*/DWORD WINAPI Sender(LPVOID lpPara附近时将可能出现什么情况答过量继电器的继
20、电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器可靠工作其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随while(1 couttext。
21、text255=0。couttext,0,(sockaddr*&addr,sizeof(addr。return 0。本文来自 CSDN 博客,转载请标明出处:使用 C/C+实现 Socket 聊天程序 解决该问题的思路 解决该问题的整体方案不外有二:1)基于 TCP 的 Socket 连接;2)基于 UDP 的 Socket 连接;但是,针对每种方案又各有很多具体的实现方法。在本次实验中,我先后开发了基于 TCP 连接和 UDP 连接的 Socket 聊天程序。具体实现思路 如下:一)基于 TCP 连接 Socket 聊天程序 基于该连接的聊天程序需要至少具备一个服务器端 Server)和一个
22、客户端Client)。在本 程序中,一个用户作为 Server 端,另一个用户作为 Clie nt 端。也就是说,作为 Server 端的用 户,需要首先启动程序,等待 Clie nt 端的连接请求。当 TCP 连接握手以后,双方方可进行交 互。从 Server 端接收消息 向 Server 端发送消息 附近时将可能出现什么情况答过量继电器的继电特性类似于电子电路中的施密特特性如图所示当加入继电器的动作电量图中的大于其设定的动作值图中的时继电器能够突然动作继电器一旦动作以后即是输入的电气量减小至稍小于其返回继电器的动作都是明确干脆的它不可能停留在某一个中间位置这种特性称为继电特性为了保证继电器
23、可靠工作其动作特性必须满足继电特性否则当加入继电器的电气量在动作值附近波动时继电器将不停地在动作和返回两个状态别采用那些技术答在过量动作的电磁型继电器中继电器的动作条件是电磁力矩大于弹簧的反拉力矩与摩擦力矩之和当电磁力矩刚刚达到动作条件时继电器的可动衔铁开始转动磁路气隙减小在外加电流或电压不变的情况下电磁力矩随 while(TRUE 向 Clie nt 端发送消息 从 Clie nt 端接收消息 二)基于 UDP 连接 Socket 聊天程序 基于该连接的聊天程序不需要具备服务器端 Server),每个客户端Client)既是服务器端 也是客户端。也就是说每个 Clie nt 端自身既可以自行
24、接收其它用户发来的消息,也可以向其 它 Clie nt 端发送消息,不需要事先与其他用户进行握手连接。因为在默认情况下 Win Sock 接口的 recvfrom(和 sen dto(都会在被调用时阻塞当前线程,也 就是说如果程序正在接受其他用户发来的数据,那么它就不能够执行发送数据的任务,反 之相同。所以为解决该问题一般有以下几种解决方案:采用 Select 模型、WSAAsyncSelect 模型、WSAEventSelect 模型、重叠(Overlapped)模型和完成接口 Completion port)模型。在本程序中,因为我没能在短时间内学会上述方案中的任一种,因此采用了 多线程技
25、术去实现消息接收和发送的同步问题。也就是说,在程序中创建两个线程,一个 线程负责发送消息,另一个消息负责接受消息。两个线程交替运行,从而达到同时收发消 息的目的。当然采用多线程方式解决消息收发同步问题可以移除上个程序中每个用户一次 只能发送一条消息的限制。本周开发源代码 代码的功能简述 使用 C/C+实现 Socket 聊天程序:TCP 版:服务器端用户和客户端用户在成功连接后,其中一方通过控制台输入消息,依次 轮流向另一方发送数据。要求,服务器端首先发起会话,并且双方每次只能发送一条消息。UDP 版:任一端用户通过指定 IP 地址将消息发送到另一端的用户。交互双方通过控制台输 入消息向另一方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 CC 实现 Socket 聊天 程序 计算机 资料 C+
限制150内