本⽂实例为⼤家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供⼤家参考,具体内容如下
0.通信步骤流程图
(左:服务器;右:客户端;)
1.服务器代码
1.1服务器类头⽂件(CServer_UDP.h)
#pragma once
#include class 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 \"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 #include class 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\ }} 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 \"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客户端 以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务