C++11实现计算机网络中的TCP/IP连接(Windows端)

这篇具有很好参考价值的文章主要介绍了C++11实现计算机网络中的TCP/IP连接(Windows端)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

TCP/IP传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol)[1]
在TCP/IP协议簇中主要包含以下内容:

  • TCP (传输控制协议) - 应用程序之间通信
  • UDP (用户数据报协议) - 应用程序之间的简单通信
  • IP (网际协议) - 计算机之间的通信
  • ICMP (因特网消息控制协议) - 针对错误和状态
  • DHCP (动态主机配置协议) - 针对动态寻址

TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。

1、TCP

TCP 用于应用程序之间的通信。
TCP使用固定的连接,会建立一个全双工的通信。
会占用两个计算机之间通信线路,直到被一方或者双方关闭。

2、IP

IP是计算机之间的通信。
IP是无连接的通信协议,不会占用两个正在通信计算机之间的通信线路。
因此IP降低对网络线路的需求,每条线可以同时满足不同计算机之间的通信需要。

2.1 IP路由器

IP包从一台计算机被发送,它会到达一个IP路由器。

IP路由器会路由这个IP包到它的目的地,直接地或者通过其它路由器。
相同通信,一个包经过的路径可能和其它包不同,而路由器会根据通信量网络中错误其它参数进行正确寻址。

3、TCP/IP

TCP/IP是不同通信协议的大集合。[1]
TCP(应用程序与应用程序之间建立的全双工通信协议),IP(计算机与计算机之间建立的通信协议)。

  • TCP负责将数据分割装入IP包,然后在到达的时候重新组合它们。
  • IP则在中间负责将包发送至接受者。

如下图表示:
windows c++ 编程 tcp,计算机网络,C++,tcp/ip,c++

IP地址:计算机的“门牌”号,有了IP地址才可以接入因特网。IP包就像快递,得知道IP地址才能发送到对应的计算机。
TCP/IP使用4组数字为计算机编址,每个计算机有唯一的4组数字地址。每组数字必须在0~255之间,并用点号分割开,这里使用的是ipv4协议

为什么TCP/IP每个地址是使用0~255之间数字?
因为规定TCP/IP协议使用32个bit编址,在计算机中 8bit=1byte=1B,所以使用四个字节来编址。
然后8bit = 8 位,因此每组地址的范围就是
0000 0000 ~ 1111 1111,范围是0 ~ 2^8 - 1,也就是0 ~ 255。

TCP/IP简化了OSI的七层模型为四层模型。

  • 优化结构。
  • 每层独立但又因为上层协议使用下层协议服务,之间又存在联系。
    windows c++ 编程 tcp,计算机网络,C++,tcp/ip,c++

4、TCP/IP协议C++11实现

Linux下网络编程主要分为四个步骤[2]

  • 1、调用 socket 函数创建套接字。
  • 2 、调用 bind 函数分配IP地址和端口号。
  • 3、调用 listen 函数转换为可接受请求状态。
  • 4、调用 accept 函数受理套接字请求。

套接字是通信中两个网路应用程序进行通信时,各自连接中的端点[3]。是通信的基石。
套接字socket表示方法是(ip地址:端口号)或(ip地址,端口号)。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)[4]

上面引用[2]里描述的整个流程是这样的,比喻为打电话。
首先需要安装电话机,因此使用套接字socket,然后分配端口号,也就是电话号码,使用bind函数给创建号的套接字分配ip地址和端口信息。有了电话和电话号码之后,需要架设电话线,使用listen函数让这台电话可用,这时其他人可以打电话到这台电话机,电话机响的时候需要接听,最后使用accept函数来保持监听。

那么我们就简单来实现一个hello world在windows下的传输。

首先我们需要建立一个服务端项目,它能够在收到信息时进行回传hello world。

  • 服务端的职能:建立socket,声明自身的端口号和地址并绑定到socket,使用listen打开监听,然后不断用accept去查看是否有连接,如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket,如果不再需要等待任何客户端连接,那么用closeSocket关闭掉自身的socket
  • 客户端职能:建立socket套接字,通过ip地址和端口号确定目标服务器。使用connect连接服务器,使用send函数发送消息,等待服务器处理,通信完成后调用closeSocket关闭socket。

参考这位朋友的博客[5]实现了基本的服务端架设,服务端代码和注释转载于(初学者的福音)windows下实现socket通信(TCP/IP)代码详解——服务端篇。

/*****************************************************************************************************************************
*	1、加载套接字库,创建套接字(WSAStartup()/socket());
*	2、绑定套接字到一个IP地址和一个端口上(bind());
*	3、将套接字设置为监听模式等待连接请求;
*	4、请求到来之后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
*	5、用返回的套接字和客户端进行通信(send()/recv());
*	6、返回,等待另一个连接请求
*	7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());
*****************************************************************************************************************************/
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")

int main()
{
	//初始化WSA
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;//WSADATA结构体变量的地址值

	//int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
	//成功时会返回0,失败时返回非零的错误代码值
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		cout << "WSAStartup() error!" << endl;
		return 0;
	}

	//创建套接字
	SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (slisten == INVALID_SOCKET)
	{
		cout << "socket error !" << endl;
		return 0;
	}

	//绑定IP和端口
	sockaddr_in sin;//ipv4的指定方法是使用struct sockaddr_in类型的变量
	sin.sin_family = AF_INET;
	sin.sin_port = htons(8888);//设置端口。htons将主机的unsigned short int转换为网络字节顺序
	sin.sin_addr.S_un.S_addr = INADDR_ANY;//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址
	//bind函数把一个地址族中的特定地址赋给scket。
	if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		printf("bind error !");
	}

	//开始监听
	if (listen(slisten, 5) == SOCKET_ERROR)
	{
		cout << "listen error !" << endl;
		return -1;
	}

	//循环接收数据
	SOCKET sclient;
	sockaddr_in remoteAddr;//sockaddr_in常用于socket定义和赋值,sockaddr用于函数参数
	int nAddrlen = sizeof(remoteAddr);
	char revData[255];
	while (true)
	{
		cout << "等待连接。。。" << endl;
		sclient = accept(slisten, (sockaddr*)&remoteAddr, &nAddrlen);
		if (sclient == INVALID_SOCKET)
		{
			cout << "accept error !" << endl;
			continue;
		}
		cout << "接收到一个连接:" << inet_ntoa(remoteAddr.sin_addr) << endl;
		//接收数据
		int ret = recv(sclient, revData, 255, 0);
		if (ret > 0)
		{
			revData[ret] = 0x00;
			cout << revData << endl;
		}
		//发送数据
		const char* sendData = "你好,TCP客户端!\n";
		send(sclient, sendData, strlen(sendData), 0);
		closesocket(sclient);
	}
	closesocket(slisten);
	WSACleanup();
	system("pause");
	//return 0;
}

客户端实现,客户端代码来源于windows环境下用c++实现socket编程:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WINSOCK2.H>
#include<STDIO.H>
#include<iostream>
#include<cstring>
using namespace std;
#pragma comment(lib, "ws2_32.lib")


int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	while (true) {
		SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
		if (sclient == INVALID_SOCKET)
		{
			printf("invalid socket!");
			return 0;
		}

		sockaddr_in serAddr;
		serAddr.sin_family = AF_INET;
		serAddr.sin_port = htons(8888);
		serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
		if (connect(sclient, (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
		{  //连接失败 
			printf("connect error !");
			closesocket(sclient);
			return 0;
		}

		string data;
		cin >> data;
		const char* sendData;
		sendData = data.c_str();   //string转const char* 
		//char * sendData = "你好,TCP服务端,我是客户端\n";
		send(sclient, sendData, strlen(sendData), 0);
		//send()用来将数据由指定的socket传给对方主机
		//int send(int s, const void * msg, int len, unsigned int flags)
		//s为已建立好连接的socket,msg指向数据内容,len则为数据长度,参数flags一般设0
		//成功则返回实际传送出去的字符数,失败返回-1,错误原因存于error 

		char recData[255];
		int ret = recv(sclient, recData, 255, 0);
		if (ret > 0) {
			recData[ret] = 0x00;
			printf(recData);
		}
		closesocket(sclient);
	}


	WSACleanup();
	return 0;

}

先运行服务端,再运行客户端,然后输入内容,便可以通过TCP/IP传输。

最终结果:
windows c++ 编程 tcp,计算机网络,C++,tcp/ip,c++

后续解析待更新。。。

参考文献

[4] 潘伟编著,计算机网络 理论与实验,厦门大学出版社,2013.12,第145页文章来源地址https://www.toymoban.com/news/detail-781817.html

到了这里,关于C++11实现计算机网络中的TCP/IP连接(Windows端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机网络—网络原理之<TCP/IP 五层协议 >图解+详述

    当应用程序间需要进行网络通讯,在 TCP/IP 五层协议的应用层需要做的工作是,程序员 自定义应用层协议 。 当前要开发一个关于“点外卖软件”的一个项目,其中有一个功能为:获取用户的订单历史(后端服务器从数据库中取出数据返回给前端页面),类似像这样的功能,

    2024年02月07日
    浏览(62)
  • 计算机网络学习01-TCP/IP 五层模型概述

    谈论计算机网络模型之前,我们先来谈谈,为什么要分层,这样的好处是什么。 当谈到Internet 时,我们总能听到的一个词汇就是 协议 (protocol)。协议定义了发送者、接收者和所有中间设备为了高效通信需要遵循的规则。当通信简单时,我们可能只是需要一个简单的协议:当通

    2024年02月08日
    浏览(40)
  • 计算机网络之TCP/IP协议第一篇:网络基础知识

    😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月09日
    浏览(66)
  • 计算机网络参考模型(OSI七层与TCP/IP协议)

    目录 1 为什么要分层 1.1 层次划分的必要性 1.2 层次划分的方法 1.2 层次划分的优点 2 七层和四层的定义 2.1 七层的介绍 2.1.1 OSI七层参考模型 2.1.2 OSI七层工作原理 2.1.3 PDU 2.2 四层的介绍 2.2.1 TCP/IP 参考模型 2.2.2 TCP/IP协议族的组成 2.2.3 数据封装和解封过程 2.2.4 设备与层的对应

    2024年02月08日
    浏览(55)
  • 【网络奇缘】- 计算机网络|分层结构|深入探索TCP/IP模型|5层参考模型

    ​ 🌈个人主页:  Aileen_0v0 🔥系列专栏:  一见倾心,再见倾城  ---  计算机网络~ 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\" 目录 OSI参考模型与TCP/IP参考模型相同点 OSI参考模型与TCP/IP参考模型不同点 面向连接三阶段(建立,传输,释放) 面向无连接(直传) 通用的5层参考

    2024年02月05日
    浏览(84)
  • 计算机网络 | I/O模型、网络模型(OSI七层及TCP/IP四层)

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 ①当上层应用 app1 调用 r

    2024年02月07日
    浏览(45)
  • 【网络】- 计算机网络体系结构 - OSI七层模型、TCP/IP四层(五层)协议

    但凡学习计算机网络知识,肯定绕不过网络协议的,而说的计算机网络协议,总是会听到 OSI七层模型 、 TCP/IP四层协议 ,有些文章又会说成是 TCP/IP五层协议 ,刚入门学这些网络协议时,给我整得一愣一愣的。 这篇文章的目的就是把计算机网络体系的这几个协议给尽可能讲清

    2024年02月03日
    浏览(67)
  • 小林coding图解计算机网络|基础篇01|TCP/IP网络模型有哪几层?

    小林coding网站通道:入口 本篇文章摘抄应付面试的重点内容,详细内容还请移步: 我们的电脑或手机使用的应用软件都是在应用层实现。应用层 只需要专注于为用户提供应用功能,不用去关心数据是如何传输的 。 而且 应用层是工作在操作系统中的用户态,传输层及以下则

    2024年04月11日
    浏览(55)
  • 计算机网络之TCP/IP协议第二篇:OSI参考模型详解

    😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月09日
    浏览(53)
  • 计算机网络学习笔记(二)OSI模型与TCP-IP模型

    7层 物链网输会示用(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层) 消耗流量的各个软件和程序。比如发送邮件的FTTP,发送文件的SMTP、万维网(HTTP) 规定两个通信端间传输数据的表达方式。 具体功能: 数据压缩与解压缩 数据加密与解密 数据格式的

    2024年01月22日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包