【网络】udp_socket编程

2023-11-05

目录

1.认识端口号

1.1 理解端口号和进程ID

1.2 理解源端口号和目的端口号

2.认识TCP协议

3.认识UDP协议

4.网络字节序

5.socket编程接口

5.1socket常见API

5.2sockaddr结构

sockaddr结构

sockaddr_in 结构

in_addr结构

6.简单的UDP网络程序

6.1创建套接字

6.2 绑定网络信息 指明IP+prot

6.3 udpServe代码

6.3.1 udpServe通用服务器

6.3.2 实现简单通信的服务器

6.4 udpClient代码

6.5本地测试


在上一讲中我们知道了网络传输的基本流程,本节我们要更加深刻的理解一下两台主机之间交互的本质。

我们在网络通信的时候,只要让两台主机能够通信就可以了吗??

实际上,在进行通信的时候不仅仅要考虑两台主机间相互交互数据!!本质上将,进行数据交互的时候是用户和用户在进行交互用户的身份,通常是用程序体现的!!程序一定是在运行中 --> 进程!!

因此主机间通信的本质是:在各自的主机上的两个进程在互相交互数据!!也就是进程间通信

IP地址可以完成主机和主机的通信,而主机上各自的通信进程才是发送和接受数据的一方。

因此我们用IP--确保主机的唯一性,再加端口号(prot)来确保该主机上的进程的唯一性.

IP:PORT = 标识互联网中唯一的一个进程!!

因此我们把IP:PORT叫做socket(套接字),因此网络通信的本质:也就是进程间通信!!

我们通常把本地的进程间通信称作SystemV进程间通信。

网络间的进程间通信用的是process,Socket.

1.认识端口号

我们刚说过端口号PROT是用来确保主机上进程的唯一性:他要告诉主机以后把消息交给哪一个进程。

端口号(port)是传输层协议的内容:

  • 端口号是一个2字节16位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • IP地址+端口号 能够标识网络上的某一台主机的某一个进程
  • 一个端口号只能被一个进程占用

1.1 理解端口号和进程ID

我们之前在学习进程的时候,学习到过pid是用来标识进程的,那么此处的端口号也是唯一表示一个进程的。那么这两者又有什么关系呢?

端口号是个数字,标定进程唯一性,更加是一种证明,证明这个进程要进行网络通信,没有端口号,这个进程可能只是本地进程。因此端口号和进程ID的差别就是这样。

因此一个进程可以绑定多个端口号,但是一个端口号只能绑定一个进程!!

1.2 理解源端口号和目的端口号

源端口号和目的端口号是传输层协议(tcp和udp)的数据段中有两个端口号,就是在描述“数据是谁发的,要发给谁”。

 

2.认识TCP协议

此处我们先对TCP(Transmission Control Protocolc 传输控制协议)有一个直观的认识,后面我们再详细讨论TCP的一些细节

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

有连接:类似于打电话,两者要建立连接

可靠传输:仍然是打电话,我说的话你都听到了,你都收到了。

3.认识UDP协议

UDP(User Datagram Protocol 用户数据报协议)

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

无连接:类似于发邮箱,不管你在不在,我都可以给你发邮件。

不可靠传输:仍然是发邮件,我发送给你,你看不看是你的事情。

4.网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
  • 接收主机把从网络上接到的字节一次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节
  • 不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接受数据
  • 如果当前发送主机是小端,就需要先将数据转成大端,否则就忽略,直接发送即可。

主机序列转网络序列<-->网络序列转主机序列

记住一个不变的准则,网络序列一定是大端的,再根据你本地主机的字节序选择转或者不转。

为使网络程序具有可移植性,是同样的C代码在大端和小端计算机上编译后都能正常运行,可调用以库函数做网络字节序和主机字节序的转换

 

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint32_t netshort);

  • 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数
  • 例如 htonl 表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回

5.socket编程接口

5.1socket常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)

int socket(int domain, int type, int protocol);

// 绑定端口号 (TCP/UDP, 服务器)

int bind(int socket, const struct sockaddr *address, socklen_t address_len);

// 开始监听socket (TCP, 服务器)

int listen(int socket, int backlog);

// 接收请求 (TCP, 服务器)

int accept(int socket, struct sockaddr* address, socklen_t* address_len);

// 建立连接 (TCP, 客户端)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

我们发现很多函数都有一个sockaddr结构,那么这是一个什么结构呢?

5.2sockaddr结构

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4,IPv6,以及UNIX Domain Socket(域间套接字 -- 不跨网络),然后各种网络协议的地址格式并不相同。

因此我们只要拿到sockaddr结构我们强转成sockaddr类型,读取前16位,如果是AF_INET则是跨网络通信,如果是AF_UNIX则是域间通信。因此我们这里都是网络通信,因此前16位都是AF_INET.

  • IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址
  • IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6.这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是那种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容
  • socket API可以都用struct sockaddr* 类型表示,在使用的时候需要强转转换成sockaddr_in;这样的好处是程序的通用性,可以接受IPv4,IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针作为参数。

sockaddr结构

sockaddr_in 结构

 

虽然socket api的接口时sockaddr,但是我们真正在基于IPv4编程时,使用的数据结构是sockaddr_in这个结构里主要有三部分信息:地址类型,端口号,IP地址

in_addr结构

 

in_addr用来表示一个IPv4的IP地址,其实就是一个32位整数

6.简单的UDP网络程序

上面的准备工作结束,我们可以实现一个简单的英译汉的功能

6.1创建套接字

int socket(int domain,int type,int protocol);

返回值:如果成功,返回一个新的文件描述符。失败返回-1。

6.2 绑定网络信息 指明IP+prot

 

6.3 udpServe代码

6.3.1 udpServe通用服务器

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cerrno>
#include <unistd.h>
#include "Log.hpp"

static void Usage(const std::string proc)
{
    std::cout<<"Usage:\n\t"<<proc<<"port [ip]" <<std::endl;
}


//udp服务器
class UdpServer
{
public:
    UdpServer(int port,std::string ip="")
    :port_((uint16_t)port)
    ,ip_(ip)
    ,sockfd_(-1)
    {}

    ~UdpServer(){}

public:
    void init()
    {
        //1.创建socket套接字
        sockfd_ = socket(AF_INET,SOCK_DGRAM,0);//就是打开了一个文件
        // 无连接的  不可靠的
        if(sockfd_ < 0)
        {
            logMessage(FATAL,"socket:%s:%d",strerror(errno),sockfd_);
            exit(1);
        }
        logMessage(DEBUG,"socket create success : %d",sockfd_);

        // 2.绑定网络信息 指明IP+prot
        // 2.1 先填充基本信息到struct sockaddr_in
        struct sockaddr_in local;
        bzero(&local,sizeof(local));//memset
        local.sin_family = AF_INET;//协议家族 前2个字节 16位 域的概念
        //填充服务器的端口号信息,是会发给对方的port_一定会到网络中
        local.sin_port = htons(port_);
        // 服务器都必须具有IP地址,
        //"aaa.zzz.yy.xx" 字符串风格的点分十进制->4字节IP->uint32_t ip
        // INADDR_ANY(0) 程序员不关心会bind到哪一个ip,任意地址bind,强烈推荐的做法
        // inet_addr:指定填充确定的ip,特殊用途,测试时使用;除了做转换,还会自动给我做序列转换
        local.sin_addr.s_addr = ip_.empty()?htonl(INADDR_ANY):inet_addr(ip_.c_str());
        // 2.2 bind网络信息
        if(bind(sockfd_,(const struct sockaddr*)&local,sizeof(local)) == -1)
        {
            logMessage(FATAL,"bind:%s:%d",strerror(errno),sockfd_);
            exit(2);
        }
        logMessage(DEBUG,"socket bind success : %d",sockfd_);
        // done 
    }

    void start()
    {
        //服务器设计的时候都是死循环
        //将来读取到的数据都放在这里
        char inbuffer[1024];
        //将来发送的数据都放在这里
        char outbuffer[1024];


        while(true)
        {
            // struct sockaddr_in peer;//远端 输出型参数
            // socklen_t len = sizeof(peer);//输入输出型参数
            // //demo 2
            // //后面的两个参数是输出型参数,谁给你发的消息 和客户端多长
            // ssize_t s = recvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,
            //     (struct sockaddr*)&peer,&len);
            
            logMessage(NOTICE,"serve 提供 service中...");
            sleep(1);
        }
    }
private:
    //服务器端口号信息
    uint16_t port_;
    //服务器必须得有ip地址
    std::string ip_;
    int sockfd_;//套接字信息
};
// ./udpSever port [ip]
int main(int argc,char* argv[])
{
    if(argc != 2 && argc != 3)
    {
        Usage(argv[0]);
        exit(3);
    }  
    uint16_t port = atoi(argv[1]);
    std::string ip;
    if(argc == 3)
    {
        ip = argv[2];
    }
    UdpServer svr(port,ip);
    svr.init();
    svr.start();

    return 0;
}

我们在用指令也可以查看当前的服务信息

netstat -lnup

  • 第一列为服务类型(Proto):当前为udp
  • 第二列表示有没有收到消息(Recv-Q):0表示没有
  • 第三列表示有没有发送消息(Send-Q):0表示没有
  • 第四列表示本地绑定的ip地址:为全0表示任意地址绑定,绑定的端口号是8080
  • Foreign Address :表示允许远端的任何主机任何端口给我发消息

注意:云服务器不能显示的写端口号,因为云服务器不允许你绑定云服务器公网IP

因此我们一旦实现绑定云服务器ip会报错。我们直接不写让他任意绑定即可

 

6.3.2 实现简单通信的服务器

我们完成服务器编写的基本框架后,我们想要实现一个可以将客户端传入的字符进行大小写转换的服务。具体服务如下:

 void start()
    {
        //服务器设计的时候都是死循环
        //将来读取到的数据都放在这里
        char inbuffer[1024];
        //将来发送的数据都放在这里
        char outbuffer[1024];


        while(true)
        {
            struct sockaddr_in peer;//远端 输出型参数
            socklen_t len = sizeof(peer);//输入输出型参数
            //demo 2
            //后面的两个参数是输出型参数,谁给你发的消息 和客户端多长
            ssize_t s = recvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,
                (struct sockaddr*)&peer,&len);
            if(s>0)
            {
                inbuffer[s] = 0;//当做字符串
            }
            else if(s == -1)
            {
                logMessage(WARINING,"recvfrom:%s:%d",strerror(errno),sockfd_);
                continue;//服务器不能退出
            }
            //走到这里一定成功了 除了读取到对方的数据 还要读取对方的网络地址[ip:port]
            std::string peerIp = inet_ntoa(peer.sin_addr);//拿到了对方的ip
            uint32_t peerPort = ntohs(peer.sin_port);//拿到了对方的port
            //打印出来客户端给服务器发送过来的消息
            logMessage(NOTICE,"[%s:%d]]# %s",peerIp.c_str(),peerPort,inbuffer);
            // logMessage(NOTICE,"serve 提供 service中...");
            // sleep(1);
        }
    }

6.4 udpClient代码

我们服务器写完之后,现在来编写客户端的代码

客户端在编写的时候不需要bind,为什么?

所谓的"不需要"指的是:不需要用户自己bind端口信息 因为OS会自动给你绑定,如果我们非要自己bind 可以 但是不推荐!!!

所有的客户端软件<- ->服务器 通信的时候 必须得有client[ip:port] <-->serve[ip:port]。为什么?

因为client很多,不能给客户bind指定的port,因为port可能被别的client使用了. 你的client就无法启动了

那么Server凭什么要bind呢?

server提供的服务,必须被所有人都知道!而且server不能随便改变!

#include <iostream>
#include <string>
#include <cstring>
#include <strings.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdlib>
#include <sys/socket.h>
#include <assert.h>
static void Usage(std::string name)
{
    std::cout << "Usage:\n\t" << name << " server_ip server_port" << std::endl;
}

// udpClient server_ip server_port
//  如果一个客户端要连接server必须知道server对应的ip和port
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }
    // 1.根据命令行 设置要访问的服务器IP
    std::string server_ip = argv[1];
    uint16_t server_port = atoi(argv[2]);

    // 2.创建客户端
    //  2.1 创建socket
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    assert(sockfd > 0);

    // 2.2 client 不需要bind
    // 所谓的"不需要" 指的是:不需要用户自己bind端口信息 因为OS会自动给你绑定
    // 如果我们非要自己bind 可以 但是不推荐
    // 所有的客户端软件<- ->服务器 通信的时候 必须得有client[ip:port] <-->serve[ip:port]
    // 为什么?client很多,不能给客户bind指定的port,因为port可能被别的client使用了
    // 你的client就无法启动了
    // 2.2 填写服务器信息
    struct sockaddr_in server;
    bzero(&server, sizeof server);
    server.sin_family = AF_INET;
    server.sin_port = htons(server_port);
    server.sin_addr.s_addr = inet_addr(server_ip.c_str());

    // 3.通信过程
    std::string buffer;
    while (true)
    {
        std::cout << "Please Enter# ";

        std::getline(std::cin, buffer);
        // 发送消息给sever
        // 首次调用sendto函数的时候 我们的client
        sendto(sockfd, buffer.c_str(), buffer.size(), 0,
               (const struct sockaddr *)&server, sizeof(server));
    }

    return 0;
}

6.5本地测试

其中127.0.0.1 是本地换回的端口号,也就是本主机

 

当然如果大家有多台主机就可以跨网络传输通信啦!

这是我朋友链接我的主机给我发送的消息(跨主机网络通信)

 

注意:如果是云服务器的话,大家一定要手动开端口号,否则是不能使用指定端口号的

(本篇完)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【网络】udp_socket编程 的相关文章

  • GCDAsyncUDPSocket源地址返回null

    谷歌代码问题镜像 https groups google com forum topic cocoaasyncsocket grhjZSMLr3U https groups google com forum topic cocoaasync
  • 在 iOS 中跨应用程序(后台/前台或分屏多任务处理)共享 UDP 数据

    我正在编写一个研究应用程序 该应用程序利用通过 UDP 广播数据的特定传感器 有各种商业应用程序使用此传感器 我们希望能够同时运行我们的应用程序和现有应用程序 在过去 iOS 8 及更低版本 我们会在后台运行应用程序来记录数据 并在前台运行
  • Android 上的 UDP 视频流

    我有一个 Android 项目 需要构建一个客户端应用程序来接收 UDP 或 RTP 单播视频流并播放它们 不幸的是 我似乎无法使其正常工作 并且已经广泛搜索了解决方案 我已经在 Xoom Android 3 2 和 Nexus S And
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • 用于接收 UDP 数据包的可变大小缓冲区

    我有一个 UDP 套接字 它将接收一些可能不同大小的数据包 并且我异步处理它 socket async receive from boost asio buffer buffer 65536 senderEndpoint handler 这
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • 更改Windows下的默认套接字缓冲区大小[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我无法更改的应用程序正在丢弃一些传入的 UDP 数据包 我怀疑接收缓冲区溢出 是否有注册表设置可以使默认缓冲区大于 8KB From th
  • HTTP 是否使用 UDP?

    这可能是一个愚蠢的问题 HTTP 是否使用过用户数据报协议 例如 如果使用 HTTP 传输 MP3 或视频 它内部是否使用 UDP 进行传输 From RFC 2616 http www ietf org rfc rfc2616 txt 通
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • 对等网络应用程序的网络发现

    我希望有两个类 一个服务器类和一个客户端类 服务器类应该接收每个新客户端的 IP 地址和端口号并将它们存储在列表中 它应该为每个客户端提供已连接客户端及其 IP 地址的列表 然后 客户端可以使用 TCP 连接相互通信 问题是客户端不知道服务
  • Windows 操作系统中无法访问的 IP 套接字关闭时间

    这些代码通过用户数据报协议提供发送数据 下面有两个代码 当我使用第一个代码来处理无法访问的 IP 地址时 我得到了三秒的延迟 请查看新结果标题 只需打开新的 C 控制台应用程序并将这些代码粘贴到其中 第一个代码 using System u
  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对

随机推荐

  • osgEarth获取显卡和硬件信息

    osgEarth Capabilities类负责获取显卡和硬件信息
  • 【单元测试】使用PowerMock框架进行Java静态方法的单元测试

    简介 一般来说 Java中的静态方法无法用传统的Jmock进行单测 这也就给研发人员和测试人员造成了一定的困扰 本文介绍一种使用PowerMock执行静态方法单元测试的手段 其实网上也有使用如Mockito的方法 大家可以自行搜索 静态方法
  • DSP的cache一般在何时会生效,防止在cache使用造成数据不一致

    在使用DSP的cache使能所有的ddr操作时 发现如果只是写操作 根据cache的机制 如果没有在了L1级hit 则直接使用write buffer来完成写操作 假如hit的话 那之前一定发生过读操作 比如移位某个字 肯定是先读入L2 L
  • C++ 序列化和反序列化

    序列化 序列化 1 背景 2 定义 3 序列化评价指标 4 序列化实例 参考 序列化 1 背景 1 在TCP的连接上 它传输数据的基本形式就是二进制流 也就是一段一段的1和0 2 在一般编程语言或者网络框架提供的API中 传输数据的基本形式
  • HFSS常用操作汇总

    HFSS常用操作 操作类 convert to read only 切角 Non Model 圆极化天线使用Discrete扫频 peakGain and GainTotal 局部区域的电流或电场等的分布 没收敛需要检查的地方 带状线设置l
  • Android界面-attrs自定义属性

    知识点 1 路径 values attrs xml 2 结构 根标签 下一级declare styleable 子标签为attr 3 arr标签 包含属性 name 该属性名称 format 该属性的值格式 子标签 enum 列举出固定的取
  • M个梨子放N个盘子

    M个梨子放N个盘子 题目描述 Macro非常喜欢吃梨 有一天他得到了ACMICPC组委会送给他的一筐梨子 他比较心疼学生 就打算把梨子分给学生吃 现在他要把M个梨子放到N个盘子里面 我们允许有的盘子为空 你能告诉Macro有多少种分法吗 请
  • 基于ResNet的MSTAR数据集目标分类

    基于ResNet的MSTAR数据集目标分类 文章目录 基于ResNet的MSTAR数据集目标分类 说在前面 1 MSART数据集介绍 2 SAR目标分类网络 3 ResNet代码及训练 4 结尾 附录 代码 说在前面 前两篇文章主要讨论了C
  • [网络安全自学篇] 一 web学习及异或解密

    开始学习杨秀璋老师的网络安全 文章会经过优化 来作为学习打卡的标志 本文为CSDN博主 Eastmount 的原创文章 一 工具 术语 1 网安术语 常见安全网站及论坛 看雪 https bbs pediy com 安全客 https ww
  • Vuejs——(7)过渡(动画)

    本篇资料来于官方文档 http cn vuejs org guide transitions html 本文是在官方文档的基础上 更加细致的说明 代码更多更全 简单来说 更适合新手阅读 二十四 过渡动画 过渡动画的定义 简单来说 就是当模块
  • Junit源码与设计模式欣赏

    先介绍下这篇博文的由来 之前已经对JUnit的使用经行了深入的介绍和演示 参考JUnit学习 一 JUnit学习 二 其中的部分功能是通过分析JUnit源代码找到的 得益于这个过程有幸完整的拜读了JUnit的源码十分赞叹作者代码的精美 一直
  • 2022人机交互-考题复习

    最下面有2022的人机交互考题 简答题 什么是人机交互 Human Computer Interaction HCI 是一门专注于设计 评估和实施供人类使用的交互式计算系统的学科 人类处理机模型 最著名的信息处理模型 Card等 1983
  • 自定义spring security oauth2 /oauth/token以及token失效/过期的返回内容格式

    前言 在整合Spring Security Oauth2的时候 获取token的接口 oauth token的返回内容格式为固定的 如下图所示 而token过期或者无效的返回参数格式如下图所示 实际在我们的项目中有时候会要求自定义返回内容格
  • Python-Regression

    本文归纳整理了线性回归 LinearRegression 岭回归 Ridge Lasso回归 Lasso 弹性网 ElasticNet K近邻 SVM等10多种机器学习模块sklearn中回归算法调用及实现过程 有需要的可以参考一下 1 加
  • postman请求传参为Boolean布尔值

    今天使用postman调用接口时 传参为Boolean时遇到了问题 使用传输方式 flag true key bonus gray secret 方法 public String markSwitch Boolean flag String
  • uboot环境变量与内核MTD分区关系

    uboot 与系统内核中MTD分区的关系 http www cnblogs com lidabo p 4774314 html 分区只是内核的概念 就是说A B地址放内核 C D地址放文件系统 也就是规定哪个地址区间放内核或者文件系统 等等
  • element 省市区三级联动

    https github com Plortinus element china area data github源码地址如下
  • [译] APT分析报告:08.漏洞利用图谱–通过查找作者的指纹来寻找漏洞

    这是作者新开的一个专栏 主要翻译国外知名安全厂商的APT报告 了解它们的安全技术 学习它们溯源APT组织和恶意代码分析的方法 希望对您有所帮助 当然 由于作者英语有限 会借助机翻进行校验 还请包涵 前文分享了APT组织拉撒路 Lazarus
  • docker安装kafka

    一 概述 Kafka是由Apache基金会开发的分布式流处理平台 采用发布 订阅模式 支持高吞吐量 低延迟的数据传输 主要用于处理实时数据管道 数据存储和数据分析等大数据应用场景 Kafka采用高效的数据压缩算法 可以在集群中存储大量的数据
  • 【网络】udp_socket编程

    目录 1 认识端口号 1 1 理解端口号和进程ID 1 2 理解源端口号和目的端口号 2 认识TCP协议 3 认识UDP协议 4 网络字节序 5 socket编程接口 5 1socket常见API 5 2sockaddr结构 sockadd