最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 實現(xiàn)即時通信的示例代碼(直接運行)

 更新時間:2022年05月12日 10:56:35   作者:別偷我能量  
本文主要介紹了C++ 實現(xiàn)即時通信的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

題目

由于本學(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語言實現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng)

    C語言實現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng)

    這篇文章主要介紹了C語言實現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++使用MFC獲取PC硬件配置信息

    C++使用MFC獲取PC硬件配置信息

    這篇文章主要為大家詳細介紹了C++使用MFC獲取PC硬件配置信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++基于遞歸和非遞歸算法判定兩個二叉樹結(jié)構(gòu)是否完全相同(結(jié)構(gòu)和數(shù)據(jù)都相同)

    C++基于遞歸和非遞歸算法判定兩個二叉樹結(jié)構(gòu)是否完全相同(結(jié)構(gòu)和數(shù)據(jù)都相同)

    這篇文章主要介紹了C++基于遞歸和非遞歸算法判定兩個二叉樹結(jié)構(gòu)是否完全相同,若判斷二叉樹的結(jié)構(gòu)和數(shù)據(jù)都相同則為完全相同.涉及C++二叉樹的創(chuàng)建、遍歷、比較等相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • c++臨時對象導(dǎo)致的生命周期問題

    c++臨時對象導(dǎo)致的生命周期問題

    對象的生命周期是c++中非常重要的概念,它直接決定了你的程序是否正確以及是否存在安全問題,這篇文章主要介紹了c++臨時對象導(dǎo)致的生命周期問題 ,需要的朋友可以參考下
    2024-07-07
  • c++實現(xiàn)通用參數(shù)解析類示例

    c++實現(xiàn)通用參數(shù)解析類示例

    使用命令行執(zhí)行程序的時候在程序后可跟多個參數(shù)列表,而main函數(shù)的argc和argv分別存儲了相關(guān)的參數(shù)個數(shù)和參數(shù)內(nèi)容,而循環(huán)輸入相關(guān)的時候就需要用戶自己來解析相關(guān)參數(shù)。以下代碼用c++的方式實現(xiàn)了相關(guān)解析的封裝,使用起來非常方便
    2014-03-03
  • 詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    這篇文章主要介紹了C++編程中標(biāo)記語句與復(fù)合語句的寫法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C語言實現(xiàn)字母大小寫轉(zhuǎn)換的方法

    C語言實現(xiàn)字母大小寫轉(zhuǎn)換的方法

    這篇文章主要介紹了C語言實現(xiàn)字母大小寫轉(zhuǎn)換的方法,涉及C語言字符串的遍歷與轉(zhuǎn)換技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • ubuntu修改gcc版本的操作方法

    ubuntu修改gcc版本的操作方法

    今天小編就為大家分享一篇ubuntu修改gcc版本的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)

    C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)

    這篇文章主要介紹了C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言中關(guān)于指針變量的坑

    C語言中關(guān)于指針變量的坑

    這篇文章主要給大家介紹了關(guān)于C語言中關(guān)于指針變量坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

宝丰县| 治县。| 扎兰屯市| 浑源县| 嵩明县| 鄂托克旗| 通山县| 平遥县| 新营市| 临高县| 英吉沙县| 华池县| 孝义市| 金山区| 介休市| 花莲市| 兴和县| 肃宁县| 辽宁省| 万宁市| 佛坪县| 三江| 乌鲁木齐县| 嘉黎县| 渝中区| 陵川县| 库伦旗| 彝良县| 金门县| 秭归县| 织金县| 鄄城县| 绥化市| 靖州| 石阡县| 宜宾市| 宕昌县| 穆棱市| 沈阳市| 靖安县| 唐海县|