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

本文实例为大家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供大家参考,具体内容如下

0.通信步骤流程图

(左:服务器;右:客户端;)

1.服务器代码

1.1服务器类头文件(CServer_UDP.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服务器类源文件(CServer_UDP.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+VS2017)

3.1服务端

3.2客户端

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++基于socket编程实现聊天室功能

    本文实例为大家分享了C++基于socket编程实现聊天室的具体代码,供大家参考,具体内容如下 服务端 // server.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h" #include <iostream> #include "winsock2.h" #include "stdlib.h" #include "stdio.h"

  • C++实现Window环境聊天室功能

    C++ Window环境聊天室,供大家参考,具体内容如下 最近闲来无事,想学习一下C++的并发编程和Socket信息传输,故以聊天室为载体进行学习.话不多说,代码开干. 聊天室分为多个客户端和一个服务器.服务器负责接收各个客户端传来的信息,然后转发给各个客户端,起到"中介"的作用:而客户端可以发送消息,并接收消息. 1.服务端 根据上述所说,一个服务器需要做的事: ① 接受新的客户端连接请求 ② 聆听各个已连接的客户端的新消息 ③ 将收到的信息逐个传送给各个已连接的服务器 所以,我设置

  • C++实现多人聊天室

    本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下 UDP 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <WinSock2.h> #include <WS2tcpip.h> #include <Windows.h> #include <thread> #i

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

    本文实例为大家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供大家参考,具体内容如下 0.通信步骤流程图 (左:服务器:右:客户端:) 1.服务器代码 1.1服务器类头文件(CServer_UDP.h) #pragma once #include <winsock2.h> class CServer_UDP { public: CServer_UDP(); void SendMsg(const char sendBuf[]); void RecMsg(); ~CServer

  • Java网络编程之简易聊天室的实现

    目录 一.题目描述 二.解题思路 三.代码详解 一.题目描述 题目实现:运行客户端,连接服务器. 二.解题思路 首先需要启动上题的ServerSocketFrame服务,这样客户端运行时,才能连接上服务器. 创建一个类:ClientSocketFrame,继承JFrame 通过Socket类创建到指定服务器和端口的套接字对象. 实例化Socket对象 socket = new Socket("127.0.0.1", 9527); // 127.0.0.1 代表的是本地IP 三.代码详解

  • Java基于中介者模式实现多人聊天室功能示例

    本文实例讲述了Java基于中介者模式实现多人聊天室功能.分享给大家供大家参考,具体如下: 一 模式定义 中介者模式,用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显示地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系. 二 模式举例 1 模式分析 我们借用多人聊天室来说明这一模式 2 中介模式静态类图 3 代码示例 3.1中介者接口--IMediator package com.demo.mediator; import com.demo.coll

  • python实现简单聊天室功能 可以私聊

    本文实例为大家分享了python实现简单聊天室功能的具体代码,供大家参考,具体内容如下 公共模块 首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在公共类中进行了异常处理 import socket,struct,json def send_dic(c,dic): dic_json=json.dumps(dic) dic_json_length=len(dic_json.encode('utf-8')) struct_dic_json_leng

  • JAVA NIO实现简单聊天室功能

    本文实例为大家分享了JAVA NIO实现简单聊天室功能的具体代码,供大家参考,具体内容如下 服务端 初始化一个ServerSocketChannel,绑定端口,然后使用Selector监听accept事件. 当有accept发生时,表示有客户端连接进来了,获取客户端的SocketChannel,然后注册其read事件:用来接收客户端发送的消息. package chatroom; import java.io.IOException; import java.net.InetSocketAddr

  • Java基于Socket实现网络编程实例详解

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

  • C#基于Socket实现简单聊天室功能

    因为这段时间在学习Socket,所以就试着写了一个简单的聊天室.主要分为服务器端和多个客户端.利用服务器端作数据中转站,实现消息群发. 1.服务器端有两个类: using System.Collections.Generic; using System.Net; using System.Net.Sockets; namespace 聊天室_Socket_TCP_服务器端 {     class Program     {         static List<Client> clients

  • 使用java基于pushlet和bootstrap实现的简单聊天室

    这是一个简单的不能再简单的聊天室,本代码包含以下功能 1.用户注册. 2.用户登录. 3.当然还可以聊天. DBUtil.java 复制代码 代码如下: package com.hongyuan.core;   import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statemen

  • nodejs实现的一个简单聊天室功能分享

    今天我来实现一个简单的聊天室,后台用nodejs, 客户端与服务端通信用socket.io,这是一个比较成熟的websocket框架. 初始工作 1.安装express, 用这个来托管socket.io,以及静态页面,命令npm install express --save,--save可以使包添加到package.json文件里. 2.安装socket.io,命令npm install socket.io --save. 编写服务端代码 首先我们通过express来托管网站,并附加到socke

  • QT UDP网络编程实现简单消息传输

    本文实例为大家分享了QT UDP实现简单消息传输的具体代码,供大家参考,具体内容如下 这几天看了下Qt的udp,顺便实现了下简单的消息传输,看起来比较简单. UDP服务器: 截图如下: 代码: server.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QUdpSocket> #include<QtNetwork> #include<QLabel> #include<QP

随机推荐