10G_ethernet学习记录(8): UDP_stack搭建

        在前面的基础上,将mac,数据两通道仲裁,arp,ip,icmp,udp等模块搭建完毕。进行组帧处理,预留的axi_user中包含了分片用于巨帧的处理。目前完成的版本是普通数据长度。巨帧协议栈版本需要等到后续与udp层一起修改。

1,udp_stack(不包含巨帧)       

对前面的各个模块的代码进行连接,


module _10g_ehternet_udp_stack
#(
    parameter                           P_SOURCE_MAC  = 48'h00_00_00_00_00_00,
    parameter                           P_TARGET_MAC  = 48'h00_00_00_00_00_00,
    parameter                           P_SOURCE_IP   = 32'hc0_01_01_01,
    parameter                           P_TARGET_IP   = 32'hc0_01_01_01,
    parameter                           P_SOURCE_PORT = 16'h8080   ,
    parameter                           P_TARGET_PORT = 16'h8080    
)
(
    input                               i_clk                      ,
    input                               i_rst                      ,

    /**************   xgmii   *********************/
    input              [  63:0]         i_xgmii_rxd                ,
    input              [   7:0]         i_xgmii_rxc                ,
    output             [  63:0]         o_xgmii_txd                ,
    output             [   7:0]         o_xgmii_txc                ,

    /**************   drp_interdace   *********************/
    input              [  47:0]         i_set_source_mac           ,
    input                               i_set_source_mac_valid     ,
    input              [  47:0]         i_set_target_mac           ,
    input                               i_set_target_mac_valid     ,
    input              [  31:0]         i_dynamic_source_ip        ,
    input                               i_dynamic_source_valid     ,
    input              [  31:0]         i_dynamic_target_ip        ,
    input                               i_dynamic_target_valid     ,

    input                               i_arp_active               ,//主动arp

    /**************   user_interface   *********************/
    input              [  63:0]         s_axis_user_data           ,
    input              [  31:0]         s_axis_user_user           ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
    input              [   7:0]         s_axis_user_keep           ,
    input                               s_axis_user_last           ,
    input                               s_axis_user_valid          ,
    output                              s_axis_user_ready          ,

    output             [  63:0]         m_axis_user_data           ,
    output             [  31:0]         m_axis_user_user           ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
    output             [   7:0]         m_axis_user_keep           ,
    output                              m_axis_user_last           ,
    output                              m_axis_user_valid           
);


/*******************************************************/
/**************   mac              *********************/
/*******************************************************/
wire                   [  63:0]         w_m_axis_mac_out_data      ;
wire                   [  79:0]         w_m_axis_mac_out_user      ;
wire                   [   7:0]         w_m_axis_mac_out_keep      ;
wire                                    w_m_axis_mac_out_last      ;
wire                                    w_m_axis_mac_out_valid     ;

wire                   [  63:0]         w_s_axis_arbiter2mac_data  ;
wire                   [  79:0]         w_s_axis_arbiter2mac_user  ;
wire                   [   7:0]         w_s_axis_arbiter2mac_keep  ;
wire                                    w_s_axis_arbiter2mac_last  ;
wire                                    w_s_axis_arbiter2mac_valid ;



/*******************************************************/
/**************   ip               *********************/
/*******************************************************/
wire                   [  31:0]         w_ip2arp_find_ip           ;
wire                                    w_ip2arp_find_valid        ;

wire                   [  47:0]         w_arp2mac_find_mac         ;
wire                                    w_arp2mac_find_valid       ;

wire                   [  63:0]         w_m_axis_ip2mac_data       ;
wire                   [  79:0]         w_m_axis_ip2mac_user       ;
wire                   [   7:0]         w_m_axis_ip2mac_keep       ;
wire                                    w_m_axis_ip2mac_last       ;
wire                                    w_m_axis_ip2mac_valid      ;

wire                   [  63:0]         w_s_axis_arbiter2ip_data   ;
wire                   [  79:0]         w_s_axis_arbiter2ip_user   ;
wire                   [   7:0]         w_s_axis_arbiter2ip_keep   ;
wire                                    w_s_axis_arbiter2ip_last   ;
wire                                    w_s_axis_arbiter2ip_valid  ;


wire                   [  63:0]         w_m_axis_ip_out_data       ;
wire                   [  55:0]         w_m_axis_ip_out_user       ;
wire                   [   7:0]         w_m_axis_ip_out_keep       ;
wire                                    w_m_axis_ip_out_last       ;
wire                                    w_m_axis_ip_out_valid      ;

/*******************************************************/
/**************   arp              *********************/
/*******************************************************/
wire                   [  63:0]         w_m_axis_arp2mac_data      ;
wire                   [  79:0]         w_m_axis_arp2mac_user      ;
wire                   [   7:0]         w_m_axis_arp2mac_keep      ;
wire                                    w_m_axis_arp2mac_last      ;
wire                                    w_m_axis_arp2mac_valid     ;



/*******************************************************/
/**************   icmp             *********************/
/*******************************************************/
wire                   [  63:0]         w_m_axis_icmp2ip_data      ;
wire                   [  55:0]         w_m_axis_icmp2ip_user      ;
wire                   [   7:0]         w_m_axis_icmp2ip_keep      ;
wire                                    w_m_axis_icmp2ip_last      ;
wire                                    w_m_axis_icmp2ip_valid     ;


/*******************************************************/
/**************   udp             *********************/
/*******************************************************/
wire                   [  63:0]         w_m_axis_udp2ip_data       ;
wire                   [  55:0]         w_m_axis_udp2ip_user       ;
wire                   [   7:0]         w_m_axis_udp2ip_keep       ;
wire                                    w_m_axis_udp2ip_last       ;
wire                                    w_m_axis_udp2ip_valid      ;


_10g_mac_module
#(
    .P_SOURCE_MAC                      (P_SOURCE_MAC              ),
    .P_TARGET_MAC                      (P_TARGET_MAC              ) 
)
_10g_mac_module_inst
(
    .i_xgmii_clk                       (i_clk                     ),
    .i_xgmii_rst                       (i_rst                     ),
    .i_xgmii_rxd                       (i_xgmii_rxd               ),
    .i_xgmii_rxc                       (i_xgmii_rxc               ),
    .o_xgmii_txd                       (o_xgmii_txd               ),
    .o_xgmii_txc                       (o_xgmii_txc               ),


    .i_find_mac                        (w_arp2mac_find_mac        ),
    .i_find_mac_valid                  (w_arp2mac_find_valid      ),
    //动态配置mac
    .i_set_source_mac                  (                          ),
    .i_set_source_mac_valid            (                          ),
    .i_set_target_mac                  (                          ),
    .i_set_target_mac_valid            (                          ),

    .m_axis_data                       (w_m_axis_mac_out_data     ),
    .m_axis_user                       (w_m_axis_mac_out_user     ),//24'd0,6'dsource_mac,2'dtype
    .m_axis_keep                       (w_m_axis_mac_out_keep     ),
    .m_axis_last                       (w_m_axis_mac_out_last     ),
    .m_axis_valid                      (w_m_axis_mac_out_valid    ),

    .s_axis_data                       (w_s_axis_arbiter2mac_data ),
    .s_axis_user                       (w_s_axis_arbiter2mac_user ),//24'd0,6'dsource_mac,2'dtype
    .s_axis_keep                       (w_s_axis_arbiter2mac_keep ),
    .s_axis_last                       (w_s_axis_arbiter2mac_last ),
    .s_axis_valid                      (w_s_axis_arbiter2mac_valid) 
);



arbiter_2_channel arbiter_2_channel_mac_ip
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),
    //c1
    .s_c1_axis_data                    (w_m_axis_arp2mac_data     ),
    .s_c1_axis_user                    (w_m_axis_arp2mac_user     ),//len(16)+source_mac(48)+type(16)
    .s_c1_axis_keep                    (w_m_axis_arp2mac_keep     ),
    .s_c1_axis_last                    (w_m_axis_arp2mac_last     ),
    .s_c1_axis_valid                   (w_m_axis_arp2mac_valid    ),
    .s_c1_axis_ready                   (                          ),//

    //c2
    .s_c2_axis_data                    (w_m_axis_ip2mac_data      ),
    .s_c2_axis_user                    (w_m_axis_ip2mac_user      ),//len(16)+source_mac(48)+type(16)
    .s_c2_axis_keep                    (w_m_axis_ip2mac_keep      ),
    .s_c2_axis_last                    (w_m_axis_ip2mac_last      ),
    .s_c2_axis_valid                   (w_m_axis_ip2mac_valid     ),
    .s_c2_axis_ready                   (                          ),//

    //arbiter
    //c1
    .m_axis_data                       (w_s_axis_arbiter2mac_data ),
    .m_axis_user                       (w_s_axis_arbiter2mac_user ),
    .m_axis_keep                       (w_s_axis_arbiter2mac_keep ),
    .m_axis_last                       (w_s_axis_arbiter2mac_last ),
    .m_axis_valid                      (w_s_axis_arbiter2mac_valid) 
);

_10g_arp_module
#(
    .P_SOURCE_MAC                      (P_SOURCE_MAC              ),
    .P_SOURCE_IP                       (P_SOURCE_IP               ),
    .P_TABLE_DEEP                      (8                         ) 
)
_10g_arp_module
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),


    //drp
    .i_set_source_mac                  (i_set_source_mac          ),
    .i_set_source_mac_valid            (i_set_source_mac_valid    ),
    .i_dynamic_source_ip               (i_dynamic_source_ip       ),
    .i_dynamic_source_valid            (i_dynamic_source_valid    ),

    .i_arp_active                      (i_arp_active              ),//主动arp

    //写入table的mac,ip
    .i_write_mac                       (                          ),
    .i_write_ip                        (                          ),
    .i_write_valid                     (                          ),

    //查找table的mac
    .i_find_ip                         (w_ip2arp_find_ip          ),
    .i_find_valid                      (w_ip2arp_find_valid       ),
    .o_find_mac                        (w_arp2mac_find_mac        ),
    .o_find_valid                      (w_arp2mac_find_valid      ),

    /**************   arp_tx   *********************/
    .m_axis_data                       (w_m_axis_arp2mac_data     ),
    .m_axis_user                       (w_m_axis_arp2mac_user     ),//len(16)+source_mac(48)+type(16)
    .m_axis_keep                       (w_m_axis_arp2mac_keep     ),
    .m_axis_last                       (w_m_axis_arp2mac_last     ),
    .m_axis_valid                      (w_m_axis_arp2mac_valid    ),

    /**************   arp_rx   *********************/
    .s_axis_data                       (w_m_axis_mac_out_data     ),
    .s_axis_user                       (w_m_axis_mac_out_user     ),//len(16)+source_mac(48)+type(16)
    .s_axis_keep                       (w_m_axis_mac_out_keep     ),
    .s_axis_last                       (w_m_axis_mac_out_last     ),
    .s_axis_valid                      (w_m_axis_mac_out_valid    ) 
);



_10g_ip_module
#(
    .P_SOURCE_IP                       (P_SOURCE_IP               ),
    .P_TARGET_IP                       (P_TARGET_IP               ) 
)
_10g_ip_module_inst
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),

    .o_find_ip                         (w_ip2arp_find_ip          ),
    .o_find_valid                      (w_ip2arp_find_valid       ),
    //drp
    .i_dynamic_source_ip               (i_dynamic_source_ip       ),
    .i_dynamic_source_valid            (i_dynamic_source_valid    ),
    .i_dynamic_target_ip               (i_dynamic_target_ip       ),
    .i_dynamic_target_valid            (i_dynamic_target_valid    ),

    /**************   axi_mac   *********************/
    .m_axis_mac_data                   (w_m_axis_ip2mac_data      ),
    .m_axis_mac_user                   (w_m_axis_ip2mac_user      ),//len(16)+source_mac(48)+type(16)
    .m_axis_mac_keep                   (w_m_axis_ip2mac_keep      ),
    .m_axis_mac_last                   (w_m_axis_ip2mac_last      ),
    .m_axis_mac_valid                  (w_m_axis_ip2mac_valid     ),

    .s_axis_mac_data                   (w_m_axis_mac_out_data     ),
    .s_axis_mac_user                   (w_m_axis_mac_out_user     ),//len(16)+source_mac(48)+type(16)
    .s_axis_mac_keep                   (w_m_axis_mac_out_keep     ),
    .s_axis_mac_last                   (w_m_axis_mac_out_last     ),
    .s_axis_mac_valid                  (w_m_axis_mac_out_valid    ),

    /**************   axi_out   *********************/
    //与UDP或者ICMP层的交互
    .m_axis_out_data                   (w_m_axis_ip_out_data      ),
    .m_axis_out_user                   (w_m_axis_ip_out_user      ),//16len + 8type + 16ip + 3mflag + 13offset
    .m_axis_out_keep                   (w_m_axis_ip_out_keep      ),
    .m_axis_out_last                   (w_m_axis_ip_out_last      ),
    .m_axis_out_valid                  (w_m_axis_ip_out_valid     ),

    .s_axis_out_data                   (w_s_axis_arbiter2ip_data  ),
    .s_axis_out_user                   (w_s_axis_arbiter2ip_user[55:0]),//16len + 8type + 16ip + 3mflag + 13offset
    .s_axis_out_keep                   (w_s_axis_arbiter2ip_keep  ),
    .s_axis_out_last                   (w_s_axis_arbiter2ip_last  ),
    .s_axis_out_valid                  (w_s_axis_arbiter2ip_valid ) 
);



arbiter_2_channel arbiter_2_channel_icmp_udp
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),
    //c1
    .s_c1_axis_data                    (w_m_axis_icmp2ip_data     ),
    .s_c1_axis_user                    ({24'd0,w_m_axis_icmp2ip_user}),//len(16)+source_mac(48)+type(16)
    .s_c1_axis_keep                    (w_m_axis_icmp2ip_keep     ),
    .s_c1_axis_last                    (w_m_axis_icmp2ip_last     ),
    .s_c1_axis_valid                   (w_m_axis_icmp2ip_valid    ),
    .s_c1_axis_ready                   (                          ),//

    //c2
    .s_c2_axis_data                    (w_m_axis_udp2ip_data      ),
    .s_c2_axis_user                    ({24'd0,w_m_axis_udp2ip_user}),//len(16)+source_mac(48)+type(16)
    .s_c2_axis_keep                    (w_m_axis_udp2ip_keep      ),
    .s_c2_axis_last                    (w_m_axis_udp2ip_last      ),
    .s_c2_axis_valid                   (w_m_axis_udp2ip_valid     ),
    .s_c2_axis_ready                   (                          ),//

    //arbiter
    //c1
    .m_axis_data                       (w_s_axis_arbiter2ip_data  ),
    .m_axis_user                       (w_s_axis_arbiter2ip_user  ),
    .m_axis_keep                       (w_s_axis_arbiter2ip_keep  ),
    .m_axis_last                       (w_s_axis_arbiter2ip_last  ),
    .m_axis_valid                      (w_s_axis_arbiter2ip_valid ) 
);

_10g_icmp_module _10g_icmp_module_inst
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),

    .m_axis_icmp2ip_data               (w_m_axis_icmp2ip_data     ),
    .m_axis_icmp2ip_user               (w_m_axis_icmp2ip_user     ),//16len + 8type + 16ip + 3mflag + 13offset
    .m_axis_icmp2ip_keep               (w_m_axis_icmp2ip_keep     ),
    .m_axis_icmp2ip_last               (w_m_axis_icmp2ip_last     ),
    .m_axis_icmp2ip_valid              (w_m_axis_icmp2ip_valid    ),

    .s_axis_ip2icmp_data               (w_m_axis_ip_out_data      ),
    .s_axis_ip2icmp_user               (w_m_axis_ip_out_user      ),//16len + 8type + 16ip + 3mflag + 13offset
    .s_axis_ip2icmp_keep               (w_m_axis_ip_out_keep      ),
    .s_axis_ip2icmp_last               (w_m_axis_ip_out_last      ),
    .s_axis_ip2icmp_valid              (w_m_axis_ip_out_valid     ) 
);

_10g_udp_module
#(
    .P_SOURCE_PORT                     (P_SOURCE_PORT             ),
    .P_TARGET_PORT                     (P_TARGET_PORT             ) 
)
_10g_udp_module_inst
(
    .i_clk                             (i_clk                     ),
    .i_rst                             (i_rst                     ),

    /**************   drp   *********************/
    .i_dynamic_source_port             (i_dynamic_source_port     ),
    .i_dynamic_source_valid            (i_dynamic_source_valid    ),
    .i_dynamic_target_port             (i_dynamic_target_port     ),
    .i_dynamic_target_valid            (i_dynamic_target_valid    ),

    /**************   ip_interface   *********************/
    .m_axis_udp2ip_data                (w_m_axis_udp2ip_data      ),
    .m_axis_udp2ip_user                (w_m_axis_udp2ip_user      ),//16len + 8type + 16ip + 3mflag + 13offset
    .m_axis_udp2ip_keep                (w_m_axis_udp2ip_keep      ),
    .m_axis_udp2ip_last                (w_m_axis_udp2ip_last      ),
    .m_axis_udp2ip_valid               (w_m_axis_udp2ip_valid     ),

    .s_axis_ip2udp_data                (w_m_axis_ip_out_data      ),
    .s_axis_ip2udp_user                (w_m_axis_ip_out_user      ),//16len + 8type + 16ip + 3mflag + 13offset
    .s_axis_ip2udp_keep                (w_m_axis_ip_out_keep      ),
    .s_axis_ip2udp_last                (w_m_axis_ip_out_last      ),
    .s_axis_ip2udp_valid               (w_m_axis_ip_out_valid     ),
    /**************   user_interface   *********************/
    .s_axis_user_data                  (s_axis_user_data          ),
    .s_axis_user_user                  (s_axis_user_user          ),//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
    .s_axis_user_keep                  (s_axis_user_keep          ),
    .s_axis_user_last                  (s_axis_user_last          ),
    .s_axis_user_valid                 (s_axis_user_valid         ),
    .s_axis_user_ready                 (s_axis_user_ready         ),

    .m_axis_user_data                  (m_axis_user_data          ),
    .m_axis_user_user                  (m_axis_user_user          ),//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
    .m_axis_user_keep                  (m_axis_user_keep          ),
    .m_axis_user_last                  (m_axis_user_last          ),
    .m_axis_user_valid                 (m_axis_user_valid         ) 
);

        将两个顶层模块连接在一起进行整体仿真,内部有一个自产生的test模块,产生数据:

连接:


xcku060_10g_ethernet_top
#(
    .P_SOURCE_MAC                      (P_SOURCE_MAC              ),
    .P_TARGET_MAC                      (P_TARGET_MAC              ),
    .P_SOURCE_IP                       (P_SOURCE_IP               ),
    .P_TARGET_IP                       (P_TARGET_IP               ),
    .P_SOURCE_PORT                     (P_SOURCE_PORT             ),
    .P_TARGET_PORT                     (P_TARGET_PORT             ) 
)
xcku060_10g_ethernet_top_send
(
    .i_sys_clk_p                       (r_sys_clk                 ),
    .i_sys_clk_n                       (~r_sys_clk                ),

    .i_mgtrefclk_p                     (r_mgtref_clk              ),
    .i_mgtrefclk_n                     (~r_mgtref_clk             ),

    .o_gt_tx_p                         (w_send_send_gt_tx_p       ),
    .o_gt_tx_n                         (w_send_send_gt_tx_n       ),
    .i_gt_rx_p                         (w_send_rec_gt_rx_p        ),
    .i_gt_rx_n                         (w_send_rec_gt_rx_n        ),
    .o_sfp_disable                     (                          ) 
);


xcku060_10g_ethernet_top
#(
    .P_SOURCE_MAC                      (P_TARGET_MAC              ),
    .P_TARGET_MAC                      (P_SOURCE_MAC              ),
    .P_SOURCE_IP                       (P_TARGET_IP               ),
    .P_TARGET_IP                       (P_SOURCE_IP               ),
    .P_SOURCE_PORT                     (P_TARGET_PORT             ),
    .P_TARGET_PORT                     (P_SOURCE_PORT             ) 
)
xcku060_10g_ethernet_top_rec
(
    .i_sys_clk_p                       (r_sys_clk                 ),
    .i_sys_clk_n                       (~r_sys_clk                ),

    .i_mgtrefclk_p                     (r_mgtref_clk              ),
    .i_mgtrefclk_n                     (~r_mgtref_clk             ),

    .o_gt_tx_p                         (w_send_rec_gt_rx_p        ),
    .o_gt_tx_n                         (w_send_rec_gt_rx_n        ),
    .i_gt_rx_p                         (w_send_send_gt_tx_p       ),
    .i_gt_rx_n                         (w_send_send_gt_tx_n       ),
    .o_sfp_disable                     (                          ) 
);

自产生数据模块:


module mac_speed_test
#(
    parameter                           P_LAST_KEEP  = 8'b1111_1111,
    parameter                           P_SOURCE_MAC = 48'h00_00_00_00_00_00,
    parameter                           P_TARGET_MAC = 48'h00_00_00_00_00_00 
)
(
    input                               i_clk                      ,
    input                               i_rst                      ,

    input              [  63:0]         s_axis_data                ,
    input              [  31:0]         s_axis_user                ,
    input              [   7:0]         s_axis_keep                ,
    input                               s_axis_last                ,
    input                               s_axis_valid               ,

    input                               m_axis_ready               ,
    output             [  63:0]         m_axis_data                ,
    output             [  31:0]         m_axis_user                ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
    output             [   7:0]         m_axis_keep                ,
    output                              m_axis_last                ,
    output                              m_axis_valid                
);

仿真波形: 

 2,udp_stack(包含巨帧)

等待施工。。。

### STM32F429以太网通讯教程 #### 实现概述 STM32F429系列微控制器支持通过其内置的MAC模块连接到外部PHY设备,如LAN8720A,从而实现完整的以太网通信功能。为了简化网络编程并提高效率,通常会采用LWIP这样的轻量级TCP/IP协议栈[^1]。 #### 开发环境搭建 对于想要快速启动项目的开发者来说,可以从指定的开源项目库获取已经配置好的工程文件和必要的驱动程序。此资源不仅提供了详细的文档指导如何安装依赖项以及编译源码,还包含了多个实用的例子用于展示不同场景下的应用方式。 #### 配置硬件接口 要使能以太网功能,在硬件层面上需确保正确连接了RJ45插座至主板上的相应引脚,并且确认所使用的PHY芯片(例如LAN8720A)已按照数据手册的要求进行了初始化设置。这部分工作一般由提供的固件包自动完成,但仍建议仔细阅读相关技术资料以便理解整个过程的工作原理。 #### 初始化软件组件 在软件方面,则需要调用特定API函数来激活内核中的Ethernet外设单元,并注册回调处理接收到的数据帧事件。下面给出了一段简单的C语言代码片段作为示范: ```c #include "lwip/opt.h" #include "lwip/init.h" void Ethernet_Init(void){ /* Initialize the LwIP stack */ lwip_init(); /* Add your network interface here, e.g., ETH */ } ``` 这段代码展示了怎样调用`lwip_init()`来进行全局性的初始化操作;而具体的物理层参数则会在后续阶段被进一步设定好。 #### 发送与接收数据报文 一旦完成了上述准备工作之后就可以着手编写发送请求或是监听回应消息的应用逻辑部分了。这里有一个更具体些的例子用来解释如何构建一个UDP客户端向服务器端口发出查询指令: ```c err_t udp_send(struct netconn *conn, struct pbuf *p) { err_t result; LWIP_ERROR("udp_send: conn != NULL", (conn != NULL), return ERR_ARG); LWIP_ASSERT("p != NULL", p != NULL); result = netconn_write(conn, p->payload, p->len, NETCONN_COPY); return result; } // Example usage of sending a UDP packet. struct netconn* conn = netconn_new(NETCONN_UDP); netconn_connect(conn, IP_ADDR4(&server_ip), server_port); udp_send(conn, payload_pbuf); ``` 以上示例中定义了一个名为`udp_send`的方法负责实际执行传输动作,并且给出了创建一个新的UDP连接对象及其关联远程地址的过程描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值