C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼(直接運(yùn)行)
題目
由于本學(xué)期上了網(wǎng)絡(luò)編程課程,老師要求寫使用Socke實(shí)現(xiàn)網(wǎng)絡(luò)編程。于是參考 C++多線程實(shí)現(xiàn)即時(shí)通信軟件 寫出了簡(jiǎn)單版本的沒(méi)有界面的即時(shí)通信軟件。
軟件:VS
直接上代碼,需要講解原理的,可以參考 C++多線程實(shí)現(xiàn)即時(shí)通信軟件
服務(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];//同時(shí)最多容納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ā)來(lái)的消息: " << buff; printf("%s發(fā)來(lái)的信息:%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 << "確認(rèn)版本失敗!\n" << endl; return -1; } cout << "確認(rèn)版本成功!" << endl; //2.創(chuàng)建Socket SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//參數(shù):協(xié)議類型、通信載體(字節(jié)流)、ip保護(hù)方式 if (serverSocket == SOCKET_ERROR) { cout << "創(chuàng)建socket失敗!" << GetLastError() << endl; //9.清楚版本信息 WSACleanup(); return -1; } cout << "socket創(chuàng)建成功!" << endl; //3.創(chuàng)建服務(wù)器協(xié)議地址族 //就是一個(gè)結(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è)置端口號(hào) 小端轉(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)聽(tīng) r = listen(serverSocket, 10); if (r == -1) { cout << "監(jiān)聽(tīng)失敗!" << GetLastError() << endl; //8.關(guān)閉socket closesocket(serverSocket); //9.清除版本信息 WSACleanup(); return -1; } cout << "監(jiān)聽(tīng)成功!" << 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 通信 多線程實(shí)現(xiàn) chat函數(shù)實(shí)現(xiàn) CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)chat, (LPVOID)i, NULL, NULL);//多線程實(shí)現(xiàn) } //8.關(guān)閉socket closesocket(serverSocket); //9.清理協(xié)議版本信息 WSACleanup(); while (1);//停頓 return 0; }
客戶端
多次點(diǎn)擊TcpClient.exe可以產(chǎn)生多個(gè)窗口
//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 << "確認(rèn)版本失敗!\n" << endl; return -1; } cout << "確認(rèn)版本成功!" << endl; //2.創(chuàng)建Socket SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//參數(shù):協(xié)議類型、通信載體(字節(jié)流)、ip保護(hù)方式 if (clientSocket == SOCKET_ERROR) { cout << "創(chuàng)建socket失敗!" << GetLastError() << endl; //9.清楚版本信息 WSACleanup(); return -1; } cout << "socket創(chuàng)建成功!" << endl; //3.獲取服務(wù)器協(xié)議地址族 //就是一個(gè)結(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è)置端口號(hào) 小端轉(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; }
運(yùn)行效果:
到此這篇關(guān)于C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼(直接運(yùn)行)的文章就介紹到這了,更多相關(guān)C++ 即時(shí)通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析
這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07C++詳細(xì)講解內(nèi)存管理工具primitives
文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下2022-06-06c語(yǔ)言循環(huán)加數(shù)組實(shí)現(xiàn)漢諾塔問(wèn)題
本文主要介紹了c語(yǔ)言循環(huán)加數(shù)組實(shí)現(xiàn)漢諾塔問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C語(yǔ)言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解
這篇文章主要介紹了C語(yǔ)言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02C語(yǔ)言字符串操作總結(jié)大全(超詳細(xì))
本篇文章是對(duì)C語(yǔ)言字符串操作進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下2013-05-05