您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页C++基于socketUDP网络编程实现简单聊天室功能

C++基于socketUDP网络编程实现简单聊天室功能

来源:爱go旅游网
C++基于socketUDP⽹络编程实现简单聊天室功能

本⽂实例为⼤家分享了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 #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 #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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务