C++ TCP通信

这篇具有很好参考价值的文章主要介绍了C++ TCP通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP协议:

        服务器 Server                                                客户端 Client

1.     确定协议版本                                           1.     确定协议版本

2.      创建socket                                              2.      创建socket

3.      确定协议地址簇                                       3.      获取服务器地址

4.      绑定                                                    

5.     监听

6.     接受客户端连接                                        4.     连接服务器

7.     通信                                                          5.     通信

8.    关闭socket                                                 6.    关闭socket

9.    清理协议版本信息                                      7.    清理协议版本信息       

用vs2019写的

单个服务器,单个客户端

Server.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<Windows.h>
#include<stdio.h>
#include<string>

int main()
{
	// 1. 确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求的版本不是2.2版本!\n");
		WSACleanup();
		return -1;
	}
	printf("请求的版本为2.2版本!\n");


	// 2  创建socket
	SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   //结构体
	if (SOCKET_ERROR == sSocket)
	{
		printf("创建socke失败 :%d\n",GetLastError());
		return -2;
	}
	printf("创建socke成功!\n");


	// 3 确定服务器的协议地址簇
	std::string ip = "127.0.0.1";
	int port = 8080;
	SOCKADDR_IN addr = {0};
	addr.sin_family = AF_INET; // 和socket函数第一个参数保持一致
	addr.sin_addr.S_un.S_addr = inet_addr(ip.c_str()); // 
	addr.sin_port = htons(port);  // 


	// 4  绑定
	int r = bind(sSocket,(sockaddr*)&addr, sizeof(addr));
	if (-1 == r)
	{
		printf("绑定失败:%d\n",GetLastError());
		// 8 断开连接
		closesocket(sSocket);
		// 9 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("绑定成功!\n");


	// 5.  监听
	r = listen(sSocket,10);
	if (-1 == r)
	{
		printf("监听失败:%d\n",GetLastError());
		// 8 断开连接
		closesocket(sSocket);
		// 9 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("监听成功!\n");

	// 6 等待客户端连接
	SOCKET cSocket = accept(sSocket,NULL,NULL);
	if (SOCKET_ERROR == cSocket)
	{
		printf("服务器崩溃:%d\n",GetLastError());
		// 8 断开连接
		closesocket(sSocket);
		// 9 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("有客户端连接上服务器了!\n");

	// 7 通信
	char buff[256] = {0};
	while (1)
	{
		r = recv(cSocket,buff,255,NULL);    // 从客户端接收数据
		if (r>0)
		{
			buff[r] = 0;  // 添加结束符号
			printf(">>%s\n",buff);  // 输出
		}

	}


	while (1);
	return 0;
}

Client.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<Windows.h>
#include<stdio.h>
#include<iostream>

int main()
{
	// 1. 确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求的版本不是2.2版本!\n");
		WSACleanup();
		return -1;
	}

	printf("请求的版本为2.2版本!\n");


	// 2  创建socket
	SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == sSocket)
	{
		printf("创建socke失败 :%d\n", GetLastError());
		return -2;
	}
	printf("创建socke成功!\n");


	// 3 确定服务器的协议地址簇
	std::string ip = "127.0.0.1";
	int port = 8080;
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET; // 和socket函数第一个参数保持一致
	addr.sin_addr.S_un.S_addr = inet_addr(ip.c_str()); // 服务器IP地址
	addr.sin_port = htons(port);  // 


	// 4  连接
	int r = connect(sSocket, (sockaddr*)&addr, sizeof(addr));
	if (-1 == r)
	{
		printf("连接失败:%d\n", GetLastError());
		return -2;
	}
	printf("连接成功!\n");

	// 5.   通信
	char buff[256];
	while (1)
	{
		memset(buff, 0, 256); // 清空数组 
		printf("发送服务器信息:");
		scanf_s("%s", buff,sizeof(buff));
		send(sSocket, buff, strlen(buff), NULL);
	}


	while (1);
	return 0;
}

多个客户端连接同一个服务器

Server.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<Windows.h>
#include<stdio.h>
#include<string>

#define NUM 1024  // 最大连接客户端

SOCKET cSocket[NUM];

int count;

// 和客户端通信的函数
void tongxin(int idx);

int main()
{
	count = 0;

	// 1. 确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求的版本不是2.2版本!\n");
		WSACleanup();
		return -1;
	}
	printf("请求的版本为2.2版本!\n");


	// 2  创建socket
	SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   //结构体
	if (SOCKET_ERROR == sSocket)
	{
		printf("创建socke失败 :%d\n",GetLastError());
		return -2;
	}
	printf("创建socke成功!\n");


	// 3 确定服务器的协议地址簇
	std::string ip = "127.0.0.1";
	int port = 8080;
	SOCKADDR_IN addr = {0};
	addr.sin_family = AF_INET; // 和socket函数第一个参数保持一致
	addr.sin_addr.S_un.S_addr = inet_addr(ip.c_str()); // 本机IP地址
	//addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 
	addr.sin_port = htons(port);  // 大小端转换  在10000左右
	//printf("addr =  %d \n",sizeof(addr));



	// 4  绑定
	int r = bind(sSocket,(sockaddr*)&addr, sizeof(addr));
	if (-1 == r)
	{
		printf("绑定失败:%d\n",GetLastError());
		// 8 断开连接
		closesocket(sSocket);
		// 9 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("绑定成功!\n");


	// 5.  监听
	r = listen(sSocket,10);
	if (-1 == r)
	{
		printf("监听失败:%d\n",GetLastError());
		// 8 断开连接
		closesocket(sSocket);
		// 9 清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("监听成功!\n");

	// 6 等待客户端连接
	for(int i =0 ;i < NUM; i++)
	{
		cSocket[i] = accept(sSocket, NULL, NULL);
		if (SOCKET_ERROR == cSocket[i])
		{
			printf("服务器崩溃:%d\n", GetLastError());
			// 8 断开连接
			closesocket(sSocket);
			// 9 清理协议版本信息
			WSACleanup();
			return -3;
		}
		printf("有客户端连接上服务器了: %d \n",i);

		count++;

		// 创建线程和客户端通信
		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tongxin, (LPVOID)i, NULL, NULL);
	}




	while (1);
	return 0;
}


// 和客户端通信
void tongxin(int idx)
{
	// 7 通信

	char buff[256] = { 0 };
	int r;
	char temp[256];
	while (1)
	{
		r = recv(cSocket[idx], buff, 255, NULL);    // 从客户端接收数据
		if (r > 0)
		{
			buff[r] = 0;  // 添加结束符号
			printf(">>%d:%s\n",idx, buff);  // 输出

			// 发送给当前连上服务器的所有客户端
			memset(temp,0,256);
			sprintf(temp, "%d:%s",idx,buff);
			for (int i = 0; i < count; i++)
			{
				send(cSocket[i],temp,strlen(temp),NULL);
			}
		}

	}

}

Client.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<Windows.h>
#include<stdio.h>
#include<iostream>


#include<graphics.h>  // easyX
SOCKET sSocket;
void scanfAndSend();

int main()
{
	initgraph(200,400,1); // 俩个窗口

	// 1. 确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		printf("请求的版本不是2.2版本!\n");
		WSACleanup();
		return -1;
	}

	printf("请求的版本为2.2版本!\n");


	// 2  创建socket
	sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == sSocket)
	{
		printf("创建socke失败 :%d\n", GetLastError());
		return -2;
	}
	printf("创建socke成功!\n");


	// 3 确定服务器的协议地址簇
	std::string ip = "127.0.0.1";
	int port = 8080;
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET; // 和socket函数第一个参数保持一致
	addr.sin_addr.S_un.S_addr = inet_addr(ip.c_str()); // 服务器IP地址
	//addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 本机IP地址
	addr.sin_port = htons(port);  // 大小端转换  在10000左右


	// 4  连接
	int r = connect(sSocket, (sockaddr*)&addr, sizeof(addr));
	if (-1 == r)
	{
		printf("连接失败:%d\n", GetLastError());
		return -2;
	}
	printf("连接成功!\n");

	CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)scanfAndSend,NULL,NULL,NULL);
	char buff[256];
	int n = 0;
	while (1)
	{
		r = recv(sSocket,buff,255,NULL);  // 循环从服务器接收
		if (r>0)
		{
			buff[r] = 0;// 添加结束符号
			// 显示到图形界面窗口
			outtextxy(1,n*20,buff);
			n++;
			if (n>18)
			{
				n = 0;
				cleardevice(); //清屏
			}
		}
	}


	while (1);
	return 0;

}


void scanfAndSend()
{
	// 5.   通信
	char buff[256];
	while (1)
	{
		memset(buff, 0, 256);    // 清空数组 
		printf("发送服务器信息:");
		scanf_s("%s", buff, sizeof(buff));   // 从命令行窗口接收发给服务器
		send(sSocket, buff, strlen(buff), NULL);
	}
}

参考:

https://www.bilibili.com/video/BV12u411r7J6/?spm_id_from=333.788.top_right_bar_window_custom_collection.content.click&vd_source=701c26bdba61a7e00f00852c31111c06文章来源地址https://www.toymoban.com/news/detail-724734.html

到了这里,关于C++ TCP通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解网络通信和TCP、IP协议-01

    计算机网络是什么? 随着计算机技术发展,计算机的体积和价格都在下降,之前计算机多用于研究机构,现 阶段逐步进入一般的公司用于办公。原来计算机之间传输数据需要通过软盘等第三方存储介 质进行转存,人们需要将数据直接通过通信线路传输,来缩短传输时间,于

    2024年02月16日
    浏览(52)
  • 网络编程——深入理解TCP/IP协议——OSI模型和TCP/IP模型:构建网络通信的基石

    TCP/IP协议,即 传输控制协议/互联网协议 ,是一组用于在计算机网络中实现通信的协议。它由两个主要的协议组成:TCP(传输控制协议)和IP(互联网协议)。TCP负责确保数据的可靠传输,而IP则负责路由数据包以在网络中传递。TCP/IP协议簇还包含其他辅助协议,如UDP(用户数

    2024年02月14日
    浏览(53)
  • SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

    TCP/IP网络通信协议最早是由 罗伯特·卡恩 (Robert E. Kahn)和 文顿·瑟夫 (Vinton G. Cerf)于1972年提出的,它是一个实际的协议栈。 OSI七层网络通信协议最早是 由国际标准化组织 (ISO)于1977年提出的,它是一个理论模型。TCP/IP网络通信协议由于其简单性和实用性,成为 事实上

    2024年01月22日
    浏览(68)
  • 网络编程day2——基于TCP/IP协议的网络通信

            计算机S                                                 计算机C      创建socket对象                                   创建socket对象      准备通信地址(自己的ip(非公网ip))      准备通信地址                                     (计算

    2024年02月10日
    浏览(64)
  • socket套接字通信 TCP传输控制协议/IP网络协议 5.18

    B/S :浏览器和服务器 C/S :客户机和服务器 网络的层次结构和每层所使用协议的集合 网络采用分层管理的方法,将网络的功能划分为不同的模块 OSI模型: 共7种: 数据的封装与传递过程: 网络传输数据大小user data: 6~1460 网络传输中容易发生拆包和粘包,所以接收和发送的字节

    2024年02月05日
    浏览(76)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(78)
  • 【netty系列-01】深入理解网络通信基本原理和tcp/ip协议

    Netty系列整体栏目 内容 链接地址 【一】深入理解网络通信基本原理和tcp/ip协议 https://zhenghuisheng.blog.csdn.net/article/details/136359640 【二】深入理解Socket本质和BIO https://zhenghuisheng.blog.csdn.net/article/details/136549478 在最初的网络中,是借鉴于这个OSI七层网络模型,而在实际开发应用中

    2024年03月17日
    浏览(59)
  • 【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙

    🌺 个人主页: Dawn黎明开始 🎀 系列专栏: 网络奇幻之旅 ⭐ 每日一句:往前走,朝着光 📢 欢迎大家:关注 🔍 +点赞 👍 +评论📝+收藏⭐️ 文章目录 📋前言 一.网络通信 1.1网络通信协议 1.2TCP/IP协议中的四个层次 二.UDP协议 2.1定义 2.2UDP连接的交互过程 三.TCP协议 3.1定义

    2024年02月05日
    浏览(47)
  • QT C++ 基于TCP通信的网络聊天室

    .ui .pro 在pro文件中添加network库 .h .main .cpp .ui .pro 在pro文件中添加network库 .h .main .cpp        

    2024年02月09日
    浏览(56)
  • 信捷PLC使用TCP/IP协议通讯

    信捷PLC的以太网机型配备RJ45接口,本文以XDME系列为例讲述信捷PLC通过TCP/IP协议与上位机进行通讯。 需注意,信捷部分机型有RJ45接口但不支持Ethernet功能,其RJ45接口用作EtherCAT与伺服驱动器连接。 优势: 1、由于TCP/IP物理层面采用网线连接,坐好屏蔽情况下网线的抗干扰性、

    2024年02月04日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包