C++ 实现即时通信的示例代码(直接运行)

 更新时间:2022年05月12日 10:56:35   作者:别偷我能量  
本文主要介绍了C++ 实现即时通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

题目

由于本学期上了网络编程课程,老师要求写使用Socke实现网络编程。于是参考 C++多线程实现即时通信软件 写出了简单版本的没有界面的即时通信软件。

软件:VS

直接上代码,需要讲解原理的,可以参考 C++多线程实现即时通信软件

服务器端

//TcpServer_plus.exe

#include<stdio.h>
#include <Winsock2.h>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<iostream>
using namespace std;
#include<windows.h>

SOCKADDR_IN cAddr = { 0 };
int len = sizeof cAddr;
SOCKET clientSocket[1001];//同时最多容纳1000人在线

void chat(int n) {
	char buff[1024];
	int r;
	while (1) {
		r = recv(clientSocket[n], buff, 1023, NULL);
		if (r > 0) {
			buff[r] = 0;
			//cout << inet_ntoa(cAddr.sin_addr) << "发来的消息: " << buff;
			printf("%s发来的信息:%s\n", inet_ntop(AF_INET, (void*)&cAddr.sin_addr, buff, 1023), buff);
		}
	}
}

int main() {

	//1.确定协议版本
	WSADATA wsadata;
	WSAStartup(MAKEWORD(2, 2), &wsadata);//2.2版本
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) {
		cout << "确认版本失败!\n" << endl;
		return -1;
	}
	cout << "确认版本成功!" << endl;

	//2.创建Socket
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//参数:协议类型、通信载体(字节流)、ip保护方式
	if (serverSocket == SOCKET_ERROR) {
		cout << "创建socket失败!" << GetLastError() << endl;
		//9.清楚版本信息
		WSACleanup();
		return -1;
	}
	cout << "socket创建成功!" << endl;

	//3.创建服务器协议地址族
	//就是一个结构体
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	inet_pton(AF_INET, "192.168.31.100", (void*)&addr.sin_addr.S_un.S_addr);
	//addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.100");//局域网地址
	addr.sin_port = htons(9999);//设置端口号 小端转大端

	//4.绑定
	int r = bind(serverSocket, (struct sockaddr*)&addr, sizeof addr);
	if (r == -1) {
		cout << "绑定失败!" << GetLastError() << endl;
		//8.关闭socket
		closesocket(serverSocket);
		//9.清除版本信息
		WSACleanup();
		return -1;
	}
	cout << "绑定成功!" << endl;

	//5.监听
	r = listen(serverSocket, 10);
	if (r == -1) {
		cout << "监听失败!" << GetLastError() << endl;
		//8.关闭socket
		closesocket(serverSocket);
		//9.清除版本信息
		WSACleanup();
		return -1;
	}
	cout << "监听成功!" << endl;

	//6.等待客户端连接(多客户端连接)
	for (int i = 0; i < 1001; i++) {
		clientSocket[i] = accept(serverSocket, (sockaddr*)&cAddr, &len);//获取客户端的socket
			if (clientSocket[i] == SOCKET_ERROR) {
			cout << "客户端连接失败:" << GetLastError() << endl;
			//关闭socket
			closesocket(serverSocket);
			//9.清楚版本信息
			WSACleanup();
			return -1;
		}
		cout << "客户端连接成功!" << endl;


		//7 通信  多线程实现 chat函数实现
		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)chat, (LPVOID)i, NULL, NULL);//多线程实现
	}
		

	//8.关闭socket
	closesocket(serverSocket);

	//9.清理协议版本信息
	WSACleanup();

	while (1);//停顿
	return 0;
}

客户端

多次点击TcpClient.exe可以产生多个窗口

//TcpClient.exe

#include<stdio.h>
#include <Winsock2.h>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<iostream>
using namespace std;
#include<windows.h>

int main() {

	//1.确定协议版本
	WSADATA wsadata;
	WSAStartup(MAKEWORD(2, 2), &wsadata);//2.2版本
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) {
		cout << "确认版本失败!\n" << endl;
		return -1;
	}
	cout << "确认版本成功!" << endl;

	//2.创建Socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//参数:协议类型、通信载体(字节流)、ip保护方式
	if (clientSocket == SOCKET_ERROR) {
		cout << "创建socket失败!" << GetLastError() << endl;
		//9.清楚版本信息
		WSACleanup();
		return -1;
	}
	cout << "socket创建成功!" << endl;

	//3.获取服务器协议地址族
	//就是一个结构体
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	inet_pton(AF_INET, "192.168.31.100", (void*)&addr.sin_addr.S_un.S_addr);
	//addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.100");//局域网地址
	addr.sin_port = htons(9999);//设置端口号 小端转大端

	//4.连接服务器
	int r = connect(clientSocket, (sockaddr*)&addr,sizeof addr);
	if (r == -1) {
		cout << "连接服务器失败:" << GetLastError() << endl;
		//6.关闭socket
		closesocket(clientSocket);
		//7 清理版本信息
		WSACleanup();
		return -1;
	}
	cout << "服务器连接成功!" << endl;

	//5.通信
	char buff[1024];
	while (1) {
		cin >> buff;//用户输入信息
		send(clientSocket, buff, strlen(buff), NULL);//发送信息


	}

	//6.关闭socket
	closesocket(clientSocket);

	//7.清理协议版本信息
	WSACleanup();

	while (1);//停顿
	return 0;
}

运行效果:

在这里插入图片描述

到此这篇关于C++ 实现即时通信的示例代码(直接运行)的文章就介绍到这了,更多相关C++ 即时通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ubuntu系统下C++调用matlab程序的方法详解

    ubuntu系统下C++调用matlab程序的方法详解

    学习c++与matlab混合编程一般是通过c++调用matlab函数,因为matlab具有强大的数学函数库,然而vc++具有界面设计灵活的优点,下面这篇文章主要给大家介绍了关于在ubuntu系统下C++调用matlab程序的方法,需要的朋友可以参考下。
    2017-08-08
  • C++实现对输入数字组进行排序

    C++实现对输入数字组进行排序

    这里给大家介绍的是通过某个方法实现判断命令行中输入的数字是几个,这样再用冒泡法排序的时候就不用担心输入的是几个数字,用到的知识主要是冒泡法排序
    2015-11-11
  • C语言枚举(enum)和联合(union)实例分享

    C语言枚举(enum)和联合(union)实例分享

    在本篇文章里小编给大家整理了关于C语言枚举(enum)和联合(union)实例内容,需要的朋友们可以学习下。
    2020-03-03
  • C语言字符串函数入门

    C语言字符串函数入门

    这篇文章主要为大家介绍了C语言字符串函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C/C++ 实现动态资源文件释放的方法

    C/C++ 实现动态资源文件释放的方法

    当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中,这篇文章主要介绍了C/C++ 实现动态资源文件释放,需要的朋友可以参考下
    2023-12-12
  • 使用UART与PC通信实现msp430g2553单片机超声波测距示例

    使用UART与PC通信实现msp430g2553单片机超声波测距示例

    这篇文章主要介绍了使用UART与PC通信实现msp430g2553单片机超声波测距示例,需要的朋友可以参考下
    2014-05-05
  • C++深浅拷贝和写时拷贝图文详解

    C++深浅拷贝和写时拷贝图文详解

    这篇文章主要给大家介绍了关于C++深浅拷贝和写时拷贝的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用C++实现迷宫游戏

    使用C++实现迷宫游戏

    这篇文章主要为大家详细介绍了C++实现迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • VisualStudio2019配置OpenCV的详细过程

    VisualStudio2019配置OpenCV的详细过程

    这篇文章主要介绍了VisualStudio2019配置OpenCV,配置系统环境找到高级系统设置等一系列操作,本文分步骤通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 详解c语言实现的内存池(适用于两个线程、不加锁、效率高)

    详解c语言实现的内存池(适用于两个线程、不加锁、效率高)

    这篇文章主要介绍了c语言实现的内存池(适用于两个线程、不加锁、效率高),设计一个内存池,要求效率比系统调用的效率要高(测试1万次),同时支持一个线程申请,另外一个线程释放,需要的朋友可以参考下
    2024-02-02

最新评论