C++socket UDP 네트워크 프로 그래 밍 기반 간단 한 채 팅 방 기능 구현

7027 단어 C++socket채 팅 방
본 논문 의 사례 는 C+socket UDP 를 바탕 으로 간단 한 채 팅 방 기능 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
0.통신 절차 흐름 도
(왼쪽:서버;오른쪽:클 라 이언 트;)

1.서버 코드
1.1 서버 클래스 헤더 파일(CServerUDP.h)

#pragma once
 
#include <winsock2.h>
 
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 서버 클래스 원본 파일(CServerUDP.cpp)

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "CServer_UDP.h"
 
#include <iostream>
 
#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 <iostream>
#include <thread>
#include <string>
 
#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 <winsock2.h>
 
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 <iostream>
 
#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 <iostream>
#include <string>
#include <thread>
 
#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+VS 2017)
3.1 서버

3.2 클 라 이언 트

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기