当前位置: 首页 > news >正文

做外账要登什么网站佛山竞价账户托管

做外账要登什么网站,佛山竞价账户托管,wordpress的阅读量,重庆1000元网站建设参考资料#xff1a; 正点原子 LwIP 之 网络接口 netif#xff08;ethernetif.c、netif.c#xff09;-CSDN博客 IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客 TCP/IP TCP/IP 协议中文名为传输控制协议/因特网互联协议#xff0c;又名网络通讯协议#xf…参考资料 正点原子 LwIP 之 网络接口 netifethernetif.c、netif.c-CSDN博客 IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客 TCP/IP TCP/IP 协议中文名为传输控制协议/因特网互联协议又名网络通讯协议是 Internet 最基本的协议、 Internet 国际互联网络的基础由网络层的 IP 协议和传输层的 TCP 协议组成。TCP/IP 定义了电子设备如何 连入因特网以及数据如何在它们之间传输的标准。协议采用了 4 层的层级结构每一层都呼叫它的下一 层所提供的协议来完成自己的需求。 通俗而言TCP 负责发现传输的问题一有问题就发出信号要求重 新传输直到所有数据安全正确地传输到目的地。而 IP 是给因特网的每一台联网设备规定一个地址。 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称而是指因特网整个 TCP/IP 协议族。从协议分层模型方 面来讲TCP/IP 由四个层次组成网络接口层、网络层、传输层、应用层。OSIOpen System Interconnection 是开放式系统互连参考模型该模型将 TCP/IP 分为七层物理层、数据链路层、网络层、传输层、会话层、 表示层和应用层。TCP/IP 模型与 OSI 模型对比如表 32.1.1 所示。 LWIP LWIP 是瑞典计算机科学院(SICS)的 Adam Dunkels 等开发的一个小型开源的 TCP/IP 协议栈是 TCP/IP 的一种实现方式。LWIP 是轻量级 IP 协议有无操作系统的支持都可以运行。 LWIP 实现的重点是在保持 TCP协议主要功能的基础上减少对 RAM的占用它只需十几KB的RAM和40K左右的ROM就可以运行 这 使 LWIP 协议栈适合在低端的嵌入式系统中使用。关于 LWIP 的详细信息大家可以去 http://savannah.nongnu.org/projects/lwip/这个网站去查阅。 LWIP 的主要特性如下 •IGMP 协议用于网络组管理可以实现多播数据的接收 •Internet 协议IP包括 IPv4 和 IPv6支持 IP 分片与重装包括通过多个网络接口的数据包转发 •用于网络维护和调试的 Internet 控制消息协议ICMP •用户数据报协议UDP •传输控制协议TCP拥塞控制往返时间RTT估计快速恢复和重传 •DNS域名解析 •SNMP简单网络管理协议 •动态主机配置协议DHCP •以太网地址解析协议ARP •AUTOIPIP 地址自动配置 •PPP点对点协议支持 PPPoE lwip212_v1_1 lwip212_v1_1是一个基于开源 lwIP 库版本 2.1.2 构建的库Vivado 2019.2 版本。         lwip212_v1_1 库为 Ethernetliteaxi_ethernetlite、TEMACaxi_ethernet以及千兆以太网控制器和 MAC GigE内核提供适配器。该库可以在 MicroBlaze、ARM Cortex-A9、ARM Cortex-A53 和 ARM Cortex-R5 处理器上运行。Ethernetlite 和 TEMAC 核心适用于 MicroBlaze 系统。千兆以太网控制器和 MACGigE内核仅适用于 ARM Cortex-A9MPSOC-7000 处理器设备、ARM Cortex-A53 和 ARM Cortex-R5 系统MPSOC UltraScale MPSoC。 lwip212_v1_1 提供二种用户编程接口方式 raw API 和 socket API Raw API是为高性能和低内存开销而定制的。这种类型的 API 把网络协议栈和应用程序放在一个进程里连接网络协议和应用程序的纽带是回调函数回调函数实际上是一个普通的 C 函数。为了接收数据 应用程序会首先向协议栈注册一个回调函数当关联的连接有一个信息到达时该回调函数就被协议栈调 用。这种实现方式即有优点也有缺点。 优点是数据的接收和发送不会导致进程的切换提供了最好的性能 执行速度快而且消耗的内存资源少 缺点是应用程序无法进行连续运算因为网络协议的处理和运算是 在同一进程中完成的二者无法并行发生。Raw API 是资源较少的嵌入式系统的首选方法也是在没有操作系统的情况下运行 lwIP 时唯一可用的 API。 Socket API提供了一个基于 open-read-write-close 模块的 BSD socket-style 接口需要操作系统是标准的网络开发的API正常情况下是基于进程方式开发的LWIP裸机情况下没有进程的概念没有优先级关系只有嵌套关系。 此接口在性能和内存要求方面不如 Raw API 高效不适用于小型嵌入式系统但移植性更好占的资源更多。 PS 的千兆以太网控制器 在介绍 PS 的千兆以太网控制器之前我们首先了解下 MAC 与 PHY 芯片及 GMII 与 RGMII 接口。 以太网卡工作在 OSI 模型的最后两层物理层和数据链路层物理层定义了数据传送与接收所需要的 电与光信号、线路状态、时钟基准、数据编码和电路等并向数据链路层设备提供标准接口。 物理层的芯 片称之为 PHY。此外 PHY 还提供了和对端设备连接的重要功能并通过 LED 灯显示出当前的连接的状态和 工作状态。 当我们给网卡接入网线的时候PHY 不断发出的脉冲信号检测到对端有设备它们通过一套标准的语言交流互相协商并确定连接速度、工作模式、是否采用流控等。 通常情况下协商的结果是两个设备中能同时支持的最大速度和最好的双工模式。 这个技术被称为 AutoNegotiation即自协商。 数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接 口等功能。 以太网卡中数据链路层的芯片称之为 MAC 控制器。 MAC 控制器与 PHY 通过 MIIMedium Independent Interface接口进行连接。MII 接口有很多类型 千兆以太网多使用GMIIGigabit Medium Independent Interface或RGMIIReduced Gigabit Media Independent Interface接口进行连接。 例程模板 /** Copyright (C) 2018 - 2019 Xilinx, Inc.* All rights reserved.** Redistribution and use in source and binary forms, with or without modification,* are permitted provided that the following conditions are met:** 1. Redistributions of source code must retain the above copyright notice,* this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright notice,* this list of conditions and the following disclaimer in the documentation* and/or other materials provided with the distribution.* 3. The name of the author may not be used to endorse or promote products* derived from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS AND ANY EXPRESS OR IMPLIED* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY* OF SUCH DAMAGE.**/#include sleep.h #include netif/xadapter.h #include platform_config.h #include xil_printf.h #include lwip/init.h #include lwip/inet.h#if LWIP_IPV61 #include lwip/ip6_addr.h #include lwip/ip6.h #else#if LWIP_DHCP1 #include lwip/dhcp.h extern volatile int dhcp_timoutcntr; err_t dhcp_start(struct netif *netif); #endif #define DEFAULT_IP_ADDRESS 192.168.1.10 #define DEFAULT_IP_MASK 255.255.255.0 #define DEFAULT_GW_ADDRESS 192.168.1.1 #endif /* LWIP_IPV6 */#ifdef XPS_BOARD_ZCU102 #ifdef XPAR_XIICPS_0_DEVICE_ID int IicPhyReset(void); #endif #endifstatic int complete_nw_thread; static sys_thread_t main_thread_handle;void print_app_header(); void start_application();#define THREAD_STACKSIZE 1024struct netif server_netif;#if LWIP_IPV61 static void print_ipv6(char *msg, ip_addr_t *ip) {print(msg);xil_printf( %s\n\r, inet6_ntoa(*ip)); } #elsestatic void print_ip(char *msg, ip_addr_t *ip) {xil_printf(msg);xil_printf(%d.%d.%d.%d\n\r, ip4_addr1(ip), ip4_addr2(ip),ip4_addr3(ip), ip4_addr4(ip)); }static void print_ip_settings(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw) {print_ip(Board IP: , ip);print_ip(Netmask : , mask);print_ip(Gateway : , gw); }static void assign_default_ip(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw) {int err;xil_printf(Configuring default IP %s \r\n, DEFAULT_IP_ADDRESS);err inet_aton(DEFAULT_IP_ADDRESS, ip);if(!err)xil_printf(Invalid default IP address: %d\r\n, err);err inet_aton(DEFAULT_IP_MASK, mask);if(!err)xil_printf(Invalid default IP MASK: %d\r\n, err);err inet_aton(DEFAULT_GW_ADDRESS, gw);if(!err)xil_printf(Invalid default gateway address: %d\r\n, err); } #endif /* LWIP_IPV6 */void network_thread(void *p) { #if ((LWIP_IPV60) (LWIP_DHCP1))int mscnt 0; #endif/* the mac address of the board. this should be unique per board */u8_t mac_ethernet_address[] { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };xil_printf(\n\r\n\r);xil_printf(-----lwIP Socket Mode TCP Server Application------\r\n);/* Add network interface to the netif_list, and set it as default */if (!xemac_add(server_netif, NULL, NULL, NULL, mac_ethernet_address,PLATFORM_EMAC_BASEADDR)) {xil_printf(Error adding N/W interface\r\n);return;}#if LWIP_IPV61server_netif.ip6_autoconfig_enabled 1;netif_create_ip6_linklocal_address(server_netif, 1);netif_ip6_addr_set_state(server_netif, 0, IP6_ADDR_VALID);print_ipv6(\n\rlink local IPv6 address is:,server_netif.ip6_addr[0]); #endif /* LWIP_IPV6 */netif_set_default(server_netif);/* specify that the network if is up */netif_set_up(server_netif);/* start packet receive thread - required for lwIP operation */sys_thread_new(xemacif_input_thread,(void(*)(void*))xemacif_input_thread, server_netif,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);complete_nw_thread 1;/* Resume the main thread; auto-negotiation is completed */vTaskResume(main_thread_handle);#if ((LWIP_IPV60) (LWIP_DHCP1))dhcp_start(server_netif);while (1) {vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS);dhcp_fine_tmr();mscnt DHCP_FINE_TIMER_MSECS;if (mscnt DHCP_COARSE_TIMER_SECS*1000) {dhcp_coarse_tmr();mscnt 0;}} #elsevTaskDelete(NULL); #endif }void main_thread(void *p) { #if ((LWIP_IPV60) (LWIP_DHCP1))int mscnt 0; #endif#ifdef XPS_BOARD_ZCU102IicPhyReset(); #endif/* initialize lwIP before calling sys_thread_new */lwip_init();/* any thread using lwIP should be created using sys_thread_new */sys_thread_new(nw_thread, network_thread, NULL,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);/* Suspend Task until auto-negotiation is completed */if (!complete_nw_thread)vTaskSuspend(NULL);#if LWIP_IPV60 #if LWIP_DHCP1while (1) {vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS);if (server_netif.ip_addr.addr) {xil_printf(DHCP request success\r\n);break;}mscnt DHCP_FINE_TIMER_MSECS;if (mscnt 10000) {xil_printf(ERROR: DHCP request timed out\r\n);assign_default_ip((server_netif.ip_addr),(server_netif.netmask),(server_netif.gw));break;}}#elseassign_default_ip((server_netif.ip_addr), (server_netif.netmask),(server_netif.gw)); #endifprint_ip_settings((server_netif.ip_addr), (server_netif.netmask),(server_netif.gw)); #endif /* LWIP_IPV6 */xil_printf(\r\n);/* print all application headers */print_app_header();xil_printf(\r\n);/* start the application*/start_application();vTaskDelete(NULL);return; }int main() {main_thread_handle sys_thread_new(main_thread, main_thread, 0,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);vTaskStartScheduler();while(1);return 0; }进程 /*------------------------------------------------ ---------------------------* * 例程sys_thread_new *----------------- -------------------------------------------------- -----* * 描述 * 启动一个优先级为“prio”的新线程该线程将在函数“thread()”中开始执行。 “arg”参数将作为参数传递给 thread() 函数。返回新 * 线程的 id。 id 和优先级均取决于系统。 * 输入 * char *name线程的名称。 * void (* thread)(void *arg)指向要运行的函数的指针。这个函数接受一个 void* 类型的参数。 * void *arg传递给线程函数的参数。 * int stacksize线程所需的堆栈大小以字节为单位。 * int prio线程的优先级。 * 输出 * sys_thread_t -- 指向每个线程超时的指针。 *------------------------------------------------- --------------------------*/ /*---------------------------------------------------------------------------** Routine: sys_thread_new*---------------------------------------------------------------------------** Description:* Starts a new thread with priority prio that will begin its* execution in the function thread(). The arg argument will be* passed as an argument to the thread() function. The id of the new* thread is returned. Both the id and the priority are system* dependent.* Inputs:* char *name -- Name of thread* void (* thread)(void *arg) -- Pointer to function to run.* void *arg -- Argument passed into function* int stacksize -- Required stack amount in bytes* int prio -- Thread priority* Outputs:* sys_thread_t -- Pointer to per-thread timeouts.*---------------------------------------------------------------------------*/ sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority ) { xTaskHandle xCreatedTask; portBASE_TYPE xResult; sys_thread_t xReturn;xResult xTaskCreate( pxThread, ( const char * const) pcName, iStackSize, pvArg, iPriority, xCreatedTask );if( xResult pdPASS ){xReturn xCreatedTask;}else{xReturn NULL;}return xReturn; }/** Prints an assertion messages and aborts execution.*/ void sys_assert( const char *pcMessage ) {(void) pcMessage;for (;;){} } /*-------------------------------------------------------------------------** End of File: sys_arch.c*-------------------------------------------------------------------------*/进程定义 主进程 void main_thread(void *p) { #if ((LWIP_IPV60) (LWIP_DHCP1))int mscnt 0; #endif#ifdef XPS_BOARD_ZCU102IicPhyReset(); #endif/* initialize lwIP before calling sys_thread_new */lwip_init();/* any thread using lwIP should be created using sys_thread_new */sys_thread_new(nw_thread, network_thread, NULL,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);/* Suspend Task until auto-negotiation is completed */if (!complete_nw_thread)vTaskSuspend(NULL);#if LWIP_IPV60 #if LWIP_DHCP1while (1) {vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS);if (server_netif.ip_addr.addr) {xil_printf(DHCP request success\r\n);break;}mscnt DHCP_FINE_TIMER_MSECS;if (mscnt 10000) {xil_printf(ERROR: DHCP request timed out\r\n);assign_default_ip((server_netif.ip_addr),(server_netif.netmask),(server_netif.gw));break;}}#elseassign_default_ip((server_netif.ip_addr), (server_netif.netmask),(server_netif.gw)); #endifprint_ip_settings((server_netif.ip_addr), (server_netif.netmask),(server_netif.gw)); #endif /* LWIP_IPV6 */xil_printf(\r\n);/* print all application headers */print_app_header();xil_printf(\r\n);/* start the application*/start_application();vTaskDelete(NULL);return; } 如果启用了DHCP定义一个计数器 mscnt。 如果目标平台是 XPS_BOARD_ZCU102则执行 IicPhyReset()这可能是与PHY相关的初始化。 调用 lwip_init() 进行lwIP协议栈的初始化。 通过 sys_thread_new 创建一个名为 nw_thread 的新线程该线程执行 network_thread 函数。这个函数主要用于网络接口的配置和启动lwIP协议栈中的相关功能。 在启动网络线程后通过 vTaskSuspend(NULL) 暂停当前任务直到网络线程完成。 如果启用了DHCP且未启用IPv6进入一个循环等待DHCP请求成功。如果超时输出错误信息并分配默认的IP地址。 如果未启用IPv6通过 assign_default_ip 分配默认的IP地址、子网掩码和网关。 打印网络配置信息。 调用 print_app_header() 打印应用程序的头部信息。 调用 start_application() 启动应用程序。 通过 vTaskDelete(NULL) 结束当前线程。 总体而言这段代码是一个lwIP网络应用程序的入口点负责初始化lwIP协议栈、创建网络线程、进行网络配置和启动应用程序。在网络线程完成初始化后主线程通过 vTaskSuspend 暂停等待网络线程完成后继续执行。 子进程 网络配置进程 LwIP 之 网络接口 netifethernetif.c、netif.c-CSDN博客 struct netif Generic data structure used for all lwIP network interfaces. The following fields should be filled in by the initialization function for the device driver: hwaddr_len, hwaddr[], mtu, flagshwaddr_len表示硬件地址MAC地址的长度。hwaddr[]表示硬件地址MAC地址的数组。mtu表示最大传输单元Maximum Transmission Unit 即网络接口可以传输的最大数据包的大小。flags表示网络接口的标志。这可以包括各种有关网络接口状态或特性的标志。这些字段的填充是在设备驱动程序的初始化函数中进行的以确保网络接口能够正确地工作。 这是在lwIP协议栈中管理网络接口的基本信息的一种方式。 void network_thread(void *p) { #if ((LWIP_IPV60) (LWIP_DHCP1))int mscnt 0; #endif/* the mac address of the board. this should be unique per board */u8_t mac_ethernet_address[] { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };xil_printf(\n\r\n\r);xil_printf(-----lwIP Socket Mode TCP Server Application------\r\n);/* struct netif *xemac_add(struct netif *netif, ip_addr_t *ipaddr, * ip_addr_t *netmask, ip_addr_t *gw, * unsigned char *mac_ethernet_address, UINTPTR mac_baseaddr) *//* 将网络接口添加到netif_list并将其设置为默认*//* Add network interface to the netif_list, and set it as default */if (!xemac_add(server_netif, NULL, NULL, NULL, mac_ethernet_address,PLATFORM_EMAC_BASEADDR)) {xil_printf(Error adding N/W interface\r\n);return;}#if LWIP_IPV61server_netif.ip6_autoconfig_enabled 1;netif_create_ip6_linklocal_address(server_netif, 1);netif_ip6_addr_set_state(server_netif, 0, IP6_ADDR_VALID);print_ipv6(\n\rlink local IPv6 address is:,server_netif.ip6_addr[0]); #endif /* LWIP_IPV6 */netif_set_default(server_netif);/* specify that the network if is up */netif_set_up(server_netif);/* The input thread calls lwIP to process any received packets.* This thread waits until a packet is received (sem_rx_data_available), * and then calls xemacif_input which processes 1 packet at a time.*//* start packet receive thread - required for lwIP operation */sys_thread_new(xemacif_input_thread,(void(*)(void*))xemacif_input_thread, server_netif,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);complete_nw_thread 1;/* Resume the main thread; auto-negotiation is completed */vTaskResume(main_thread_handle);#if ((LWIP_IPV60) (LWIP_DHCP1))dhcp_start(server_netif);while (1) {vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS);dhcp_fine_tmr();mscnt DHCP_FINE_TIMER_MSECS;if (mscnt DHCP_COARSE_TIMER_SECS*1000) {dhcp_coarse_tmr();mscnt 0;}} #elsevTaskDelete(NULL); #endif } 定义了一个函数 network_thread该函数接受一个 void* 类型的参数通常用于线程传递。 初始化了一个以太网 MAC 地址 mac_ethernet_address。 添加网络接口到 netif_list 中并设置为默认接口。 如果启用了IPv6配置IPv6地址。 将网络接口标记为 up表示网络接口已准备好接收和发送数据。 启动一个新的线程 xemacif_input_thread用于处理接收到的网络数据包监听EMAC 标记网络线程已完成complete_nw_thread 1。 恢复主线程的执行vTaskResume(main_thread_handle)。 如果未启用IPv6且启用了DHCP启动DHCP客户端并进入一个无限循环等待DHCP完成。 如果启用了IPv6或未启用DHCP通过 vTaskDelete(NULL) 结束当前线程。 总体而言这段代码负责配置网络接口启动lwIP协议栈的相关功能包括处理接收到的数据包和启动DHCP客户端。在网络配置完成后它通过 vTaskResume 恢复主线程的执行。 DHCP IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客         DHCPDynamic Host Configuration Protocol是一种网络协议用于自动分配IP地址和其他网络配置信息给计算机或设备。以下是DHCP的基本原理和功能 自动IP地址分配 DHCP允许计算机或设备在加入网络时自动获取IP地址而无需手动配置。这有助于简化网络管理特别是在大型网络中。 配置信息分发 除了IP地址外DHCP还可以分配其他网络配置信息包括子网掩码、网关、DNS服务器等。这使得设备能够在连接到网络时获取所有必要的配置信息。 动态分配 DHCP支持动态IP地址分配其中IP地址是从一个地址池中动态分配的而不是静态分配给特定设备。这有助于更有效地管理IP地址资源。 租约机制 DHCP分配的IP地址是有限期的称为租约。设备在租约到期前可以续租否则将释放该IP地址返回到地址池中供其他设备使用。这有助于防止未使用的IP地址占用网络资源。 减少配置错误 DHCP减少了手动配置IP地址和相关网络信息的可能性从而降低了配置错误的风险。 在上述代码中DHCP被用于自动获取IP地址并通过循环定期调用DHCP的定时器函数来处理DHCP过程。DHCP的执行过程会在后台自动完成直到获取到有效的IP地址或超时。 LwIP 之 网络接口 netifethernetif.c、netif.c-CSDN博客 LwIP使用netif来描述一个硬件网络接口但是由于网络接口是直接与硬件打交道的硬件不同则处理可能不同必须由用户提供最底层接口。 LwIP的网络驱动有一定的模型/src/netif/ethernetif.c文件即为底层接口的驱动的模版用户为自己的网络设备实现驱动时应参照此模块。 该文件中的函数通常为与硬件打交道的函数当有数据接收的时候被调用以使接收到的数据进入tcpip协议栈。   简单来说netif是LwIP抽象出来的各网络接口协议栈可以使用多个不同的接口而ethernetif则提供了netif访问硬件的各接口每个不同的接口有不同的ethernetif。 print_app_header void print_app_header(void) {xil_printf(TCP server listening on port %d\r\n,TCP_CONN_PORT); #if LWIP_IPV61xil_printf(On Host: Run $iperf -V -c %s%%interface -i %d -t 300 -w 2M\r\n,inet6_ntoa(server_netif.ip6_addr[0]),INTERIM_REPORT_INTERVAL); #elsexil_printf(On Host: Run $iperf -c %s -i %d -t 300 -w 2M\r\n,inet_ntoa(server_netif.ip_addr),INTERIM_REPORT_INTERVAL); #endif /* LWIP_IPV6 */ } 使用 xil_printf 函数输出TCP服务器监听的端口号通过 %d 显示 TCP_CONN_PORT 变量的值。 使用条件编译判断IPv6是否启用如果启用输出一条IPv6相关的命令提示包括使用 iperf 工具进行测试的命令。其中inet6_ntoa 函数用于将IPv6地址转换成可打印的字符串格式并获取 server_netif 结构体中的第一个IPv6地址server_netif.ip6_addr[0]。 如果未启用IPv6输出一条IPv4相关的命令提示同样包括使用 iperf 工具进行测试的命令。其中inet_ntoa 函数用于将IPv4地址转换成可打印的字符串格式并获取 server_netif 结构体中的IPv4地址server_netif.ip_addr。 这样该函数为用户提供了与TCP服务器通信的建议命令方便用户在主机上运行相应的 iperf 命令进行性能测试。 start_application 1.启动Socket失败则打印 2. void start_application(void) {int sock, new_sd; #if LWIP_IPV61struct sockaddr_in6 address, remote; #elsestruct sockaddr_in address, remote; #endif /* LWIP_IPV6 */int size;/* set up address to connect to */memset(address, 0, sizeof(address)); #if LWIP_IPV61if ((sock lwip_socket(AF_INET6, SOCK_STREAM, 0)) 0) {xil_printf(TCP server: Error creating Socket\r\n);return;}address.sin6_family AF_INET6;address.sin6_port htons(TCP_CONN_PORT);address.sin6_len sizeof(address); #elseif ((sock lwip_socket(AF_INET, SOCK_STREAM, 0)) 0) {xil_printf(TCP server: Error creating Socket\r\n);return;}address.sin_family AF_INET;address.sin_port htons(TCP_CONN_PORT);address.sin_addr.s_addr INADDR_ANY; #endif /* LWIP_IPV6 */if (bind(sock, (struct sockaddr *)address, sizeof (address)) 0) {xil_printf(TCP server: Unable to bind to port %d\r\n,TCP_CONN_PORT);close(sock);return;}if (listen(sock, 1) 0) {xil_printf(TCP server: tcp_listen failed\r\n);close(sock);return;}size sizeof(remote);while (1) {if ((new_sd accept(sock, (struct sockaddr *)remote,(socklen_t *)size)) 0)sys_thread_new(TCP_recv_perf thread,tcp_recv_perf_traffic, (void*)new_sd,TCP_SERVER_THREAD_STACKSIZE,DEFAULT_THREAD_PRIO);} } 数据收发相关函数 lwip_recvfrom int s: 套接字描述符标识特定的套接字。 void *mem: 用于存储接收数据的缓冲区的指针。 size_t len: 缓冲区的长度表示 mem 所指向的缓冲区的最大容量。 int flags: 一些标志用于指定接收操作的行为。struct sockaddr *from: 用于存储发送方地址信息的结构体指针。 在UDP套接字中此参数用于获取发送方的地址信息。 socklen_t *fromlen: 指向存储发送方地址长度的变量的指针。 在UDP套接字中用于获取发送方地址信息的长度。接收来源EMAC的数据来自EMAC的数据会有一部分缓冲于此 与void *mem: 用于存储接收数据的缓冲区的指针。这个缓冲区存在差别此处存放的是解析后的数据。 通常不需要指定。 lwip_recvfrom(int s, void *mem, size_t len, int flags,struct sockaddr *from, socklen_t *fromlen) {struct lwip_sock *sock;ssize_t ret;LWIP_DEBUGF(SOCKETS_DEBUG, (lwip_recvfrom(%d, %p, %SZT_F, 0x%x, ..)\n, s, mem, len, flags));sock get_socket(s);if (!sock) {return -1;} #if LWIP_TCPif (NETCONNTYPE_GROUP(netconn_type(sock-conn)) NETCONN_TCP) {ret lwip_recv_tcp(sock, mem, len, flags);lwip_recv_tcp_from(sock, from, fromlen, lwip_recvfrom, s, ret);done_socket(sock);return ret;} else #endif{u16_t datagram_len 0;struct iovec vec;struct msghdr msg;err_t err;vec.iov_base mem;vec.iov_len len;msg.msg_control NULL;msg.msg_controllen 0;msg.msg_flags 0;msg.msg_iov vec;msg.msg_iovlen 1;msg.msg_name from;msg.msg_namelen (fromlen ? *fromlen : 0);err lwip_recvfrom_udp_raw(sock, flags, msg, datagram_len, s);if (err ! ERR_OK) {LWIP_DEBUGF(SOCKETS_DEBUG, (lwip_recvfrom[UDP/RAW](%d): buf NULL, error is \%s\!\n,s, lwip_strerr(err)));sock_set_errno(sock, err_to_errno(err));done_socket(sock);return -1;}ret (ssize_t)LWIP_MIN(LWIP_MIN(len, datagram_len), SSIZE_MAX);if (fromlen) {*fromlen msg.msg_namelen;}}sock_set_errno(sock, 0);done_socket(sock);return ret; } lwip_read ssize_t lwip_read(int s, void *mem, size_t len) {return lwip_recvfrom(s, mem, len, 0, NULL, NULL); }lwip_send int s: 套接字描述符标识特定的套接字。 const void *data: 指向要发送数据的缓冲区的指针。 size_t size: 要发送的数据的字节数。 int flags: 一些标志用于指定发送操作的行为。 ssize_t lwip_send(int s, const void *data, size_t size, int flags) {struct lwip_sock *sock;err_t err;u8_t write_flags;size_t written;LWIP_DEBUGF(SOCKETS_DEBUG, (lwip_send(%d, data%p, size%SZT_F, flags0x%x)\n,s, data, size, flags));sock get_socket(s);if (!sock) {return -1;}if (NETCONNTYPE_GROUP(netconn_type(sock-conn)) ! NETCONN_TCP) { #if (LWIP_UDP || LWIP_RAW)done_socket(sock); #if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETEreturn lwip_sendto_blocking(s, data, size, flags, NULL, 0); #elsereturn lwip_sendto(s, data, size, flags, NULL, 0); #endif #else /* (LWIP_UDP || LWIP_RAW) */sock_set_errno(sock, err_to_errno(ERR_ARG));done_socket(sock);return -1; #endif /* (LWIP_UDP || LWIP_RAW) */}write_flags (u8_t)(NETCONN_COPY |((flags MSG_MORE) ? NETCONN_MORE : 0) |((flags MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));written 0;err netconn_write_partly(sock-conn, data, size, write_flags, written);LWIP_DEBUGF(SOCKETS_DEBUG, (lwip_send(%d) err%d written%SZT_F\n, s, err, written));sock_set_errno(sock, err_to_errno(err));done_socket(sock);/* casting written to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */return (err ERR_OK ? (ssize_t)written : -1); }
http://www.dnsts.com.cn/news/134644.html

相关文章:

  • 北京企业网站制作哪家好网站建设价格差别
  • 进入 网站cms昆明seo排名外包
  • 郑州网站app开发做我的世界缩略图的网站
  • wordpress 自助建站三网合一网站模板
  • 建立一个网站多少钱廊坊做网站公司哪家好
  • 做公益网站需要哪些部门认证网站后台管理软件
  • 广州市增城建设局网站我认为的网络营销是什么
  • 网站点击率怎么建网站维护需要做那些事
  • 镇江网站建设优化做外贸都得有网站吗
  • 嘉兴网站建设系统番禺微网站建设
  • 餐饮美食网站建设需求分析北京海淀区区号
  • 备案的网站可以攻击吗产品包装设计模板
  • 河南企业网站优化外包wordpress post id清理
  • 高端品牌网站建设公司哪家好网站开发的大致流程
  • 自己怎样建立网站成都实验室装修设计公司
  • 绵阳做网站优化wordpress主题左目录
  • 做网站linux和win房产网排名
  • 网站优化大计公建一般多少钱
  • 合肥网站推广电话合肥序曲网站建设公司怎么样
  • 网站百度收录东莞网站优化公司哪家好
  • 代理加盟微信网站建设python做网站多么
  • 网站数据库连接不上的常见问题沈阳建设工程信息网可访问中项网
  • 企业网站实名制企业网站seo哪里好
  • 中医协会网站建设方案微信公众号怎样开通
  • 网站开发使用哪些开发语言帮助网站网站做优化
  • 市场营销主要学什么西安做网站优化公司报价
  • 设计网站logowordpress 内链
  • 做网站那个服务器好深圳装修公司口碑排名
  • 网站限时抢购怎么做专业分类目录
  • 企业网站建设上市公司wordpress如何换背景