本文主要介绍了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++ 即时通信内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:C++ 实现即时通信的示例代码(直接运行)
猜你喜欢
- C语言qsort()函数的使用方法详解 2023-04-26
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Qt计时器使用方法详解 2023-05-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C++ 数据结构超详细讲解顺序表 2023-03-25
- Easyx实现扫雷游戏 2023-02-06