C++|C++ 实现即时通信的示例代码(直接运行)
目录
- 题目
- 软件:VS
- 服务器端
- 客户端
题目 由于本学期上了网络编程课程,老师要求写使用Socke实现网络编程。于是参考 C++多线程实现即时通信软件 写出了简单版本的没有界面的即时通信软件。
软件:VS 直接上代码,需要讲解原理的,可以参考 C++多线程实现即时通信软件
服务器端
//TcpServer_plus.exe#include#include#include #pragma comment(lib,"ws2_32.lib")#include using namespace std; #include 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.关闭socketclosesocket(serverSocket); //9.清除版本信息WSACleanup(); return -1; } cout << "绑定成功!" << endl; //5.监听 r = listen(serverSocket, 10); if (r == -1) {cout << "监听失败!" << GetLastError() << endl; //8.关闭socketclosesocket(serverSocket); //9.清除版本信息WSACleanup(); return -1; } cout << "监听成功!" << endl; //6.等待客户端连接(多客户端连接) for (int i = 0; i < 1001; i++) {clientSocket[i] = accept(serverSocket, (sockaddr*)&cAddr, &len); //获取客户端的socketif (clientSocket[i] == SOCKET_ERROR) {cout << "客户端连接失败:" << GetLastError() << endl; //关闭socketclosesocket(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; }
【C++|C++ 实现即时通信的示例代码(直接运行)】
客户端 多次点击TcpClient.exe可以产生多个窗口
//TcpClient.exe#include#include#include #pragma comment(lib,"ws2_32.lib")#include using namespace std; #include 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.关闭socketclosesocket(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++ 即时通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Vue实现下拉表格组件
- C语言实现简单酒店管理系统
- C语言实现酒店管理系统
- springboot整合shiro实现登录验证授权
- 70行JavaScript代码实现除夕夜倒计时 零基础也能学会~
- 作业|【Java】实现计算器
- 七种基于比较的排序,基于Java实现,收藏一下()
- #yyds干货盘点#Python图像处理,cv2模块,OpenCV实现目标跟踪
- 鸿蒙轻内核M核源码分析(LibC实现之Musl LibC)
- 编译安装http2.4,实现可以正常访问