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;
}