先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
结构图
:
struct sockaddr {
unsigned short sa_family; // 2 bytes address family, AF\_xxx unsiged short
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr\_in {
short sin_family; // 2 bytes e.g. AF\_INET, AF\_INET6
unsigned short sin_port; // 2 bytes e.g. htons(3490)
struct in\_addr sin_addr; // 4 bytes see struct in\_addr, below
char sin_zero[8]; // 8 bytes zero this if you want to
};
struct in\_addr {
unsigned long s_addr; // 4 bytes load with inet\_pton()
};
用例
:
4. 认识UDP协议
- Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种
无需建立连接就可以发送封装的 IP 数据包的方法
。 - Internet 的
传输层
有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。 传输层协议
无连接
不可靠传输
面向数据报(SOCK_DGRAM)
UDP的框架图
:
5. socket编程接口
- 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
用例
:
- domain:用于设置网络通信的域,socket根据这个参数选择信息协议的族(一般选择如下两个,但不止如此两个)
AF_INET
IPv4 Internet protocols //用于IPV4AF_INET6
IPv6 Internet protocols //用于IPV6
- type:(只列出最重要的三个):
SOCK_STREAM
Provides sequenced, reliable, two-way, connection-based byte streams. //用于TCPSOCK_DGRAM
Supports datagrams (connectionless, unreliable messages ). //用于UDPSOCK_RAW
Provides raw network protocol access. //RAW类型,用于提供原始网络访问
- protocol:置0即可
- 返回值:
成功:非负的文件描述符
失败:-1
- 绑定端口号 (TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr\* my_addr, socklen_t addrlen);
用例
:
- sockfd:正在监听端口的套接口文件描述符,通过socket获得
- my_addr:需要绑定的IP和端口
- addrlen:my_addr的结构体的大小
- 返回值:
成功:0
失败:-1
- 发送 (TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void \*buf, size_t len, int flags,
const struct sockaddr \*dest_addr, socklen_t addrlen);
用例
:
- sockfd:正在监听端口的套接口文件描述符,通过socket获得
- buf:发送缓冲区,往往是使用者定义的数组,该数组装有要发送的数据
- len:发送缓冲区的大小,单位是字节
- flags:填0即可
- dest_addr:指向接收数据的主机地址信息的结构体,也就是该参数指定数据要发送到哪个主机哪个进程
- addrlen:表示第五个参数所指向内容的长度
- 返回值:
成功:返回发送成功的数据长度
失败: -1
- 接收(TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void \*buf, size_t len, int flags,
struct sockaddr \*src_addr, socklen_t \*addrlen);
用例
:
- sockfd:正在监听端口的套接口文件描述符,通过socket获得
- buf:接收缓冲区,往往是使用者定义的数组,该数组装有接收到的数据
- len:接收缓冲区的大小,单位是字节
- flags:填0即可
- src_addr:指向发送数据的主机地址信息的结构体,也就是我们可以从该参数获取到数据是谁发出的
- addrlen:表示第五个参数所指向内容的长度
- 返回值:
成功:返回接收成功的数据长度
失败: -1
6. 代码实现UDP
- udpClient.cpp
#include"udpClient.hpp"
void Usage(std::string proc)
{
std::cout<<"Usage: "<<proc<<" svr\_ip svr\_port"<<std::endl;
}
int main(int argc,char \*argv[])
{
if(argc != 3)
{
Usage(argv[0]);
exit(1);
}
udpClient uc(argv[1],atoi(argv[2]));
uc.initClient();
uc.start();
return 0;
}
- udpClient.hpp
#pragma once
#include<iostream>
#include<string>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<cstdlib>
class udpClient
{
public:
//Server ip , port;
udpClient(std::string _ip="127.0.0.1",int _port=8080)
:ip(_ip)
,port(_port)
{}
void initClient()
{
sock = socket(AF_INET,SOCK_DGRAM,0);
std::cout<<"sock"<<sock<<std::endl;
// struct sockaddr\_in local;
// local.sin\_family = AF\_INET;
// local.sin\_port = htons(port);
// local.sin\_addr.s\_addr = inet\_addr(ip.c\_str());
//
//
// if(bind(sock,(struct sockaddr\*)&local,sizeof(local)) < 0)
// {
// std::cerr<<"bind error!\n"<<std::endl;
// exit(1);
// }
}
void start()
{
// char msg[64];
std::string msg;
struct sockaddr\_in peer;
peer.sin_family = AF_INET;
peer.sin_port = htons(port);
peer.sin_addr.s_addr = inet\_addr(ip.c\_str());
while(1)
{
std::cout<<"Please Enter: ";
std::cin>>msg;
if(msg == "quit")
{
break;
}
sendto(sock,msg.c\_str(),msg.size(),0,(struct sockaddr\*)&peer,sizeof(peer));
char echo[128];
ssize_t s=recvfrom(sock,echo,sizeof(echo)-1,0,nullptr,nullptr);
echo[s]='\0';
if(s>0)
{
std::cout<<" server: "<<echo<<std::endl;
}
// msg[0]='\0';
// struct sockaddr\_in end\_point;
// socklen\_t len = sizeof(end\_point);
// ssize\_t s=recvfrom(sock,msg,sizeof(msg)-1,0,(struct sockaddr\*)&end\_point,&len);
// if(s>0)
// {
// msg[s]='\0';
// std::cout<<"Client :" << msg <<std::endl;
// std::string echo\_string = msg;
// echo\_string += " [server echo!]";
// sendto(sock,echo\_string.c\_str(),echo\_string.size(),0,(struct sockaddr\*)&end\_point,len);
// }
}
}
~udpClient()
{
close(sock);
}
private:
std::string ip;
int port;
int sock;
};
- udpServer.cpp
#include"udpServer.hpp"
void Usage(std::string proc)
{
std::cout<<"Usage: "<< proc <<"local\_ip local\_proc"<<std::endl;
}
int main(int argc,char \*argv[])
{
if(argc != 2)
{
Usage(argv[0]);
exit(1);
}
udpServer \*up = new udpServer(atoi(argv[1]));
up->initServer();
up->start();
delete up;
}
- udpServer.hpp
#pragma once
#include<iostream>
#include<string>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<cstdlib>
#include<cstdio>
#include<map>
class udpServer
{
public:
udpServer(int _port=8080)
// :ip(\_ip)
:port(_port)
{
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/1ec0e90d4ddb33d1941b8ed8b94570dc.png)
![img](https://img-blog.csdnimg.cn/img_convert/69ed9e8024294fe6ff1e47d2c35fecbf.png)
![img](https://img-blog.csdnimg.cn/img_convert/5f4e557c393102f7b232c99a9abadf33.png)
![img](https://img-blog.csdnimg.cn/img_convert/5d7fdb649e3ba247ed92102a9c817fb7.png)
![img](https://img-blog.csdnimg.cn/img_convert/ee90c233d9e6bee4f76833990ddd7723.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
50)]
[外链图片转存中...(img-vBa8mRwc-1715003427850)]
[外链图片转存中...(img-6QhTHoGN-1715003427851)]
[外链图片转存中...(img-hFsfW4Fy-1715003427851)]
[外链图片转存中...(img-HcF3Qg69-1715003427851)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**