C++基于socket UDP网络编程怎么实现聊天室功能
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,本文小编为大家详细介绍"C++基于socket UDP网络编程怎么实现聊天室功能",内容详细,步骤清晰,细节处理妥当,希望这篇"C++基于socket UDP网络编程怎么实现聊天室功能"文章能帮助大家
千家信息网最后更新 2025年02月23日C++基于socket UDP网络编程怎么实现聊天室功能
本文小编为大家详细介绍"C++基于socket UDP网络编程怎么实现聊天室功能",内容详细,步骤清晰,细节处理妥当,希望这篇"C++基于socket UDP网络编程怎么实现聊天室功能"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
0.通信步骤流程图
(左:服务器;右:客户端;)
1.服务器代码
1.1服务器类头文件(CServer_UDP.h)
#pragma once #includeclass CServer_UDP{public: CServer_UDP(); void SendMsg(const char sendBuf[]); void RecMsg(); ~CServer_UDP(); private: SOCKET m_sServer; struct sockaddr_in m_SocAddrClient; //建立连接时,用于保存客户端信息 bool m_terminal;};
1.2服务器类源文件(CServer_UDP.cpp)
#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CServer_UDP.h" #include#pragma comment(lib, "ws2_32.lib") CServer_UDP::CServer_UDP():m_terminal(false){ //必须进行如下初始化, 否则socket()会返回10093错误 //初始化WSA WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) //通过一个进程初始化ws2_32.dll { std::cout << "Initialize WSA failed" << std::endl; return; } //初始化UDDP套接字 m_sServer = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in m_SocAddrserver; m_SocAddrserver.sin_addr.S_un.S_addr = 0;//htonl(INADDR_ANY); m_SocAddrserver.sin_family = AF_INET; m_SocAddrserver.sin_port = htons(8090); int ret = bind(m_sServer, (sockaddr*)&m_SocAddrserver, sizeof(m_SocAddrserver)); if (ret == -1) { std::cout << "bind failed!" << std::endl; WSACleanup(); } else { //此处必须赋初值,不然会导致服务器端无法正常发送 int len_Client = sizeof(sockaddr); char recBuf[1025]; int len = recvfrom(m_sServer, recBuf, 1024, 0, (sockaddr*)&m_SocAddrClient, &len_Client); if (len > 0) { recBuf[len] = '\0'; std::cout << "Client say:" << recBuf << std::endl; } } }void CServer_UDP::SendMsg(const char sendBuf[]){ int ret = sendto(m_sServer, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_SocAddrClient, sizeof(m_SocAddrClient)); if (ret == -1) { std::cout << "send failed" << std::endl; std::cout << GetLastError()<< std::endl; }}void CServer_UDP::RecMsg(){ char recBuf[1025]; while (!m_terminal) { //std::cout << "Begin rec...(server)" << std::endl; int len = recvfrom(m_sServer, recBuf, 1024, 0, 0, 0); if (len > 0) { recBuf[len] = '\0'; std::cout << "Client say:" << recBuf << std::endl; } } }CServer_UDP::~CServer_UDP(){ closesocket(m_sServer); WSACleanup(); }
1.3服务器主函数
#include#include #include #include "CServer_UDP.h" using namespace std; int main(){ CServer_UDP server_UDP; thread recProc(&CServer_UDP::RecMsg, &server_UDP); while (1) { //cout << "Pleaes input content:" << endl; string content; cin >> content; server_UDP.SendMsg(content.c_str()); } recProc.join(); cout << "I love china!" << endl; system("pause"); return 0;}
2.客户端代码
2.1客户端类头文件(CClient.h)
#pragma once #includeclass CClient{public: CClient(); void RecMsg(); void SendMsg(const char sendBuf[]); ~CClient();private: SOCKET m_sockClient; sockaddr_in m_TargetServer;};
2.2客户端类源文件(CClient.cpp)
#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CClient.h" #include#pragma comment(lib, "ws2_32.lib") CClient::CClient(){ //必须进行如下初始化, 否则socket()会返回10093错误 //初始化WSA WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) //通过一个进程初始化ws2_32.dll { std::cout << "Initialize WSA failed" << std::endl; return; } m_sockClient = socket(AF_INET, SOCK_DGRAM, 0); m_TargetServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); m_TargetServer.sin_family = AF_INET; m_TargetServer.sin_port = htons(8090); if (m_sockClient == -1) { std::cout << "Create socket failed!" << std::endl; WSACleanup(); } else { //发送信息与服务器建立连接(必须加) sendto(m_sockClient, "hello server", strlen("hello server"), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer)); }} void CClient::SendMsg(const char sendBuf[]){ sendto(m_sockClient, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer));}void CClient::RecMsg(){ char recBuf[1025]; while (1) { //std::cout << "Begin rec...(client)" << std::endl; int len = recvfrom(m_sockClient, recBuf, 1024, 0, 0, 0); if (len > 0) { recBuf[len] = '\0'; std::cout << "Server say: " << recBuf << std::endl; } } }CClient::~CClient(){ closesocket(m_sockClient); WSACleanup();}
2.3客户端主函数
#include#include #include #include "CClient.h" using namespace std; int main(){ CClient client_UDP; thread RecProc(&CClient::RecMsg, &client_UDP); while (1) { //cout << "Please input content:" << endl; string content; cin >> content; client_UDP.SendMsg(content.c_str()); } RecProc.join(); cout << "I love china!" << endl; system("pause"); return 0;}
3.效果图(win7+VS2017)
3.1服务端
3.2客户端
读到这里,这篇"C++基于socket UDP网络编程怎么实现聊天室功能"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
客户
客户端
服务
服务器
功能
网络
网络编程
聊天室
C++
编程
文章
代码
信息
内容
函数
文件
服务器类
步骤
源文件
进程
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发流程ppt模板
oracle数据库清空
扫码点单软件开发教程
广东新房网络技术有限公司
服务器管理器使用说明
执法局网络安全落实情况报告
网络安全 龙头
5g网络安全声明
药店数据库
泰安智慧医养软件开发电话
湖北省网络安全领导小组
数据和事实型数据库
南昌软件开发测试学校
青浦区本地软件开发技术指导
信息网络安全信息安全区别
农业银行刷卡显示服务器连不上
数据库获取主机名
长株潭工控网络安全
周公解梦数据库
红色基因数据库是什么意思
苏州服务器硬盘数据恢复教程
网络安全考研难度排行
我的世界服务器备份需要备份哪些
电脑qq的好友数据库
沧州市点讯软件开发有限公司
华为网络技术与应用实验实训报告
数据库不能插入相同数字怎么改
台电服务器设置
列式数据库为什么批量写
东方通中间件是不是服务器