C++ 實現(xiàn)即時通信的示例代碼(直接運行)
題目
由于本學(xué)期上了網(wǎng)絡(luò)編程課程,老師要求寫使用Socke實現(xiàn)網(wǎng)絡(luò)編程。于是參考 C++多線程實現(xiàn)即時通信軟件 寫出了簡單版本的沒有界面的即時通信軟件。
軟件:VS
直接上代碼,需要講解原理的,可以參考 C++多線程實現(xiàn)即時通信軟件
服務(wù)器端
//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) << "發(fā)來的消息: " << buff;
printf("%s發(fā)來的信息:%s\n", inet_ntop(AF_INET, (void*)&cAddr.sin_addr, buff, 1023), buff);
}
}
}
int main() {
//1.確定協(xié)議版本
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.創(chuàng)建Socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//參數(shù):協(xié)議類型、通信載體(字節(jié)流)、ip保護方式
if (serverSocket == SOCKET_ERROR) {
cout << "創(chuàng)建socket失敗!" << GetLastError() << endl;
//9.清楚版本信息
WSACleanup();
return -1;
}
cout << "socket創(chuàng)建成功!" << endl;
//3.創(chuàng)建服務(wù)器協(xié)議地址族
//就是一個結(jié)構(gòu)體
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");//局域網(wǎng)地址
addr.sin_port = htons(9999);//設(shè)置端口號 小端轉(zhuǎn)大端
//4.綁定
int r = bind(serverSocket, (struct sockaddr*)&addr, sizeof addr);
if (r == -1) {
cout << "綁定失敗!" << GetLastError() << endl;
//8.關(guān)閉socket
closesocket(serverSocket);
//9.清除版本信息
WSACleanup();
return -1;
}
cout << "綁定成功!" << endl;
//5.監(jiān)聽
r = listen(serverSocket, 10);
if (r == -1) {
cout << "監(jiān)聽失敗!" << GetLastError() << endl;
//8.關(guān)閉socket
closesocket(serverSocket);
//9.清除版本信息
WSACleanup();
return -1;
}
cout << "監(jiān)聽成功!" << 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;
//關(guān)閉socket
closesocket(serverSocket);
//9.清楚版本信息
WSACleanup();
return -1;
}
cout << "客戶端連接成功!" << endl;
//7 通信 多線程實現(xiàn) chat函數(shù)實現(xiàn)
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)chat, (LPVOID)i, NULL, NULL);//多線程實現(xiàn)
}
//8.關(guān)閉socket
closesocket(serverSocket);
//9.清理協(xié)議版本信息
WSACleanup();
while (1);//停頓
return 0;
}
客戶端
多次點擊TcpClient.exe可以產(chǎn)生多個窗口
//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.確定協(xié)議版本
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.創(chuàng)建Socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//參數(shù):協(xié)議類型、通信載體(字節(jié)流)、ip保護方式
if (clientSocket == SOCKET_ERROR) {
cout << "創(chuàng)建socket失敗!" << GetLastError() << endl;
//9.清楚版本信息
WSACleanup();
return -1;
}
cout << "socket創(chuàng)建成功!" << endl;
//3.獲取服務(wù)器協(xié)議地址族
//就是一個結(jié)構(gòu)體
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");//局域網(wǎng)地址
addr.sin_port = htons(9999);//設(shè)置端口號 小端轉(zhuǎn)大端
//4.連接服務(wù)器
int r = connect(clientSocket, (sockaddr*)&addr,sizeof addr);
if (r == -1) {
cout << "連接服務(wù)器失?。? << GetLastError() << endl;
//6.關(guān)閉socket
closesocket(clientSocket);
//7 清理版本信息
WSACleanup();
return -1;
}
cout << "服務(wù)器連接成功!" << endl;
//5.通信
char buff[1024];
while (1) {
cin >> buff;//用戶輸入信息
send(clientSocket, buff, strlen(buff), NULL);//發(fā)送信息
}
//6.關(guān)閉socket
closesocket(clientSocket);
//7.清理協(xié)議版本信息
WSACleanup();
while (1);//停頓
return 0;
}
運行效果:

到此這篇關(guān)于C++ 實現(xiàn)即時通信的示例代碼(直接運行)的文章就介紹到這了,更多相關(guān)C++ 即時通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析
這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題
本文主要介紹了c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
C語言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解
這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

