2020.12.03 第17课 TCP和UDP

2020.12.3 第17课 TCP和UDP

OSI(开放式系统互联通信)七层网络模型
(参考模型 英语:Open System Interconnection Reference Model,缩写为 OSI)
OSI网络模型是一个开放式系统互联的参考模型。通过这个参考模型,用户可以非常直观地了解网络通信
的基本过程和原理。OSI参考模型如下图所示

01_TCP简单实现

(TCP(Transmission Control Protocol)传输控制协议用于保证被传送信息的完整性)

1.TCPServer

/*
	1.初始化套接字库
	2.创建套接字
	3.初始化套接字 ip 端口
	4.处理ip和端口
	5.绑定ip
	6.监听
	7.接受请求
	数据交互:发送和接收数据
*/
#include <iostream>
#include <winsock2.h>				//包含套接字头文件
#pragma comment(lib,"WS2_32.lib")	//加载静态库  DLL 动态库
using namespace std;
int main()
{
	//1.初始化套接字库
	WSADATA data;				//版本信息 用来使用初始化函数   结构体
	WORD w = MAKEWORD(2, 0);	// 2.0
	WSAStartup(w, &data);		//初始化套接字库
	//2.创建套接字
	SOCKET s, s1;		//TCP服务器de 	处理识别客户端的套接字
	//3.调用socket函数初始化套接字
	s = socket(AF_INET, SOCK_STREAM, 0);//socket 地址,通信类型模式tcp流套接字 遗留参数
	//调用接口
	//4.ip地址和端口的处理  sockaddr_in
	sockaddr_in addr, addr2;
	int len = sizeof(addr2);
	//地址簇
	addr.sin_family = AF_INET; //地址家族 ipv4
	//端口
	addr.sin_port = htons(88888);	//主机到网络
	//服务器的ip
	addr.sin_addr.S_un.S_addr = INADDR_ANY;	//任何ip都可以接入
	//5.绑定
	bind(s, (sockaddr *)&addr, sizeof(addr));
	//6.监听
	listen(s, 5);
	cout << "TCPServer服务器启动:" << endl;
	char sendStr[] = "I am back!\r\n";
	while (1)
	{
		//接收请求
		s1 = accept(s, (sockaddr*)&addr2, &len);
		if (s1 != NULL)
		{
			//打印一下客户端的IP地址  大端
			cout << inet_ntoa(addr2.sin_addr) << endl;  //addr2 结构体类型 网络到本机
			send(s1, sendStr, sizeof(sendStr), 0);		//发送套接字里的信息 
		}
		if (getchar())
		{
			break;
		}
	}
	//收尾
	closesocket(s);
	closesocket(s1);
	WSACleanup();  //清楚套接字库的资源
	return 0;
}

2.TCPClient

#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib");
using namespace std;
int main()
{
	//1.初始化套接字库
	WSADATA data;
	WORD w = MAKEWORD(2, 0);
	WSAStartup(w, &data);
	//2.创建套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);  
	//3.处理地址和ip
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(88888);
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //服务器
	connect(s, (sockaddr*)&addr, sizeof(addr));
	cout << "TCPClient已启动:" << endl;
	char recvStr[1024] = "";
	recv(s, recvStr, sizeof(recvStr),0);
	cout << "Servers:" << recvStr << endl;
	closesocket(s);
	WSACleanup();
	system("pause");
	return 0;
}

02_UDP简单实现

Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

1.UDPServer

#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
	WSADATA data;
	WORD w = MAKEWORD(2, 0);
	WSAStartup(w, &data);

	SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
	sockaddr_in addr, addr1;
	int n = sizeof(addr);

	addr.sin_family = AF_INET;
	addr.sin_port = htons(66666);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;

	bind(s, (sockaddr*)&addr, sizeof(addr));
	//int bind(int sockfd, const struct sockaddr* myaddr, socklen_t addrlen)
	//	'sockfd    : socket()函数返回的描述符
	//	'myaddr    : 指明要绑定的本地IP和端口号,使用网络字节序
	//	'addrlen   : 常被设置为sizeof(struct sockaddr)
	cout << "UDPServer Start" << endl;
	char recvStr[20] = "";
	char sendStr[20] = "";
	while (1)
	{
		//发送和接收:sendto recvfrom
		if (recvfrom(s, recvStr, 20, 0, (sockaddr*)&addr1, &n) != 0)
		{
			cout << inet_ntoa(addr1.sin_addr) << ":" << endl;
			cout << "Client say:" << recvStr << endl;
			cin >> sendStr;
			sendto(s, sendStr, sizeof(sendStr), 0, (sockaddr*)&addr1, n);
			system("pause");
		}
	}
	closesocket(s);
	WSACleanup();
	return 0;
}

2.UDPClient

#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
	WSADATA data;
	WORD w = MAKEWORD(2, 0);
	WSAStartup(w, &data);

	SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
	//指定ip和端口
	sockaddr_in addr, addr2;
	int n = sizeof(addr);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(66666);
	addr.sin_addr.S_un.S_addr = inet_addr("172.21.0.147");

	char sendStr[20] = "";
	char recvStr[20] = "";
	cout << "UPDClient start:" << endl;
	while (1)
	{
		cout << "Client to Servers:";
		cin >> sendStr;
		if (sendto(s,sendStr,sizeof(sendStr),0,(sockaddr*)&addr,n)!=0)
		{
			recvfrom(s,recvStr,20,0,(sockaddr*)&addr2,&n);
			cout << "Servers say:" << recvStr << endl;
			system("pause");
		}

	}
	closesocket(s);
	WSACleanup();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值