亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ping.c

?? NXPl788上lwip的無操作系統移植,基于Embest開發板
?? C
字號:
/**
 * @file
 * Ping sender module
 *
 */

/*
 * 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.
 *
 * This file is part of the lwIP TCP/IP stack.
 * 
 */

/** 
 * This is an example of a "ping" sender (with raw API and socket API).
 * It can be used as a start point to maintain opened a network connection, or
 * like a network "watchdog" for your device.
 *
 */

#include "lwip/opt.h"

#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */

#include "ping.h"

#include "lwip/mem.h"
#include "lwip/raw.h"
#include "lwip/icmp.h"
#include "lwip/netif.h"
#include "lwip/sys.h"
#include "lwip/timers.h"
#include "lwip/inet_chksum.h"

#if PING_USE_SOCKETS
#include "lwip/sockets.h"
#include "lwip/inet.h"
#endif /* PING_USE_SOCKETS */


/**
 * PING_DEBUG: Enable debugging for PING.
 */
#ifndef PING_DEBUG
#define PING_DEBUG     LWIP_DBG_ON
#endif

/** ping target - should be a "ip_addr_t" */
#ifndef PING_TARGET
#define PING_TARGET   (netif_default?netif_default->gw:ip_addr_any)
#endif

/** ping receive timeout - in milliseconds */
#ifndef PING_RCV_TIMEO
#define PING_RCV_TIMEO 1000
#endif

/** ping delay - in milliseconds */
#ifndef PING_DELAY
#define PING_DELAY     1000
#endif

/** ping identifier - must fit on a u16_t */
#ifndef PING_ID
#define PING_ID        0xAFAF
#endif

/** ping additional data size to include in the packet */
#ifndef PING_DATA_SIZE
#define PING_DATA_SIZE 32
#endif

/** ping result action - no default action */
#ifndef PING_RESULT
#define PING_RESULT(ping_ok)
#endif

/* ping variables */
static u16_t ping_seq_num;
static u32_t ping_time;
#if !PING_USE_SOCKETS
static struct raw_pcb *ping_pcb;
#endif /* PING_USE_SOCKETS */

/** Prepare a echo ICMP request */
static void
ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len)
{
  size_t i;
  size_t data_len = len - sizeof(struct icmp_echo_hdr);

  ICMPH_TYPE_SET(iecho, ICMP_ECHO);
  ICMPH_CODE_SET(iecho, 0);
  iecho->chksum = 0;
  iecho->id     = PING_ID;
  iecho->seqno  = htons(++ping_seq_num);

  /* fill the additional data buffer with some data */
  for(i = 0; i < data_len; i++) {
    ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i;
  }

  iecho->chksum = inet_chksum(iecho, len);
}

#if PING_USE_SOCKETS

/* Ping using the socket ip */
static err_t
ping_send(int s, ip_addr_t *addr)
{
  int err;
  struct icmp_echo_hdr *iecho;
  struct sockaddr_in to;
  size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
  LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff);

  iecho = (struct icmp_echo_hdr *)mem_malloc((mem_size_t)ping_size);
  if (!iecho) {
    return ERR_MEM;
  }

  ping_prepare_echo(iecho, (u16_t)ping_size);

  to.sin_len = sizeof(to);
  to.sin_family = AF_INET;
  inet_addr_from_ipaddr(&to.sin_addr, addr);

  err = lwip_sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to));

  mem_free(iecho);

  return (err ? ERR_OK : ERR_VAL);
}

static void
ping_recv(int s)
{
  char buf[64];
  int fromlen, len;
  struct sockaddr_in from;
  struct ip_hdr *iphdr;
  struct icmp_echo_hdr *iecho;

  while((len = lwip_recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr*)&from, (socklen_t*)&fromlen)) > 0) {
    if (len >= (int)(sizeof(struct ip_hdr)+sizeof(struct icmp_echo_hdr))) {
      ip_addr_t fromaddr;
      inet_addr_to_ipaddr(&fromaddr, &from.sin_addr);
      LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
      ip_addr_debug_print(PING_DEBUG, &fromaddr);
      LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now() - ping_time)));

      iphdr = (struct ip_hdr *)buf;
      iecho = (struct icmp_echo_hdr *)(buf + (IPH_HL(iphdr) * 4));
      if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_seq_num))) {
        /* do some ping result processing */
        PING_RESULT((ICMPH_TYPE(iecho) == ICMP_ER));
        return;
      } else {
        LWIP_DEBUGF( PING_DEBUG, ("ping: drop\n"));
      }
    }
  }

  if (len == 0) {
    LWIP_DEBUGF( PING_DEBUG, ("ping: recv - %"U32_F" ms - timeout\n", (sys_now()-ping_time)));
  }

  /* do some ping result processing */
  PING_RESULT(0);
}

static void
ping_thread(void *arg)
{
  int s;
  int timeout = PING_RCV_TIMEO;
  ip_addr_t ping_target;

  LWIP_UNUSED_ARG(arg);

  if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) {
    return;
  }

  lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

  while (1) {
    ping_target = PING_TARGET;

    if (ping_send(s, &ping_target) == ERR_OK) {
      LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
      ip_addr_debug_print(PING_DEBUG, &ping_target);
      LWIP_DEBUGF( PING_DEBUG, ("\n"));

      ping_time = sys_now();
      ping_recv(s);
    } else {
      LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
      ip_addr_debug_print(PING_DEBUG, &ping_target);
      LWIP_DEBUGF( PING_DEBUG, (" - error\n"));
    }
    sys_msleep(PING_DELAY);
  }
}

#else /* PING_USE_SOCKETS */

/* Ping using the raw ip */
static u8_t
ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *addr)
{
  struct icmp_echo_hdr *iecho;
  LWIP_UNUSED_ARG(arg);
  LWIP_UNUSED_ARG(pcb);
  LWIP_UNUSED_ARG(addr);
  LWIP_ASSERT("p != NULL", p != NULL);

  if (pbuf_header( p, -PBUF_IP_HLEN)==0) {
    iecho = (struct icmp_echo_hdr *)p->payload;

    if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_seq_num))) {
      LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
      ip_addr_debug_print(PING_DEBUG, addr);
      LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now()-ping_time)));

      /* do some ping result processing */
      PING_RESULT(1);
      pbuf_free(p);
      return 1; /* eat the packet */
    }
  }

  return 0; /* don't eat the packet */
}

static void
ping_send(struct raw_pcb *raw, ip_addr_t *addr)
{
  struct pbuf *p;
  struct icmp_echo_hdr *iecho;
  size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;

  LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
  ip_addr_debug_print(PING_DEBUG, addr);
  LWIP_DEBUGF( PING_DEBUG, ("\n"));
  LWIP_ASSERT("ping_size <= 0xffff", ping_size <= 0xffff);

  p = pbuf_alloc(PBUF_IP, (u16_t)ping_size, PBUF_RAM);
  if (!p) {
    return;
  }
  if ((p->len == p->tot_len) && (p->next == NULL)) {
    iecho = (struct icmp_echo_hdr *)p->payload;

    ping_prepare_echo(iecho, (u16_t)ping_size);

    raw_sendto(raw, p, addr);
    ping_time = sys_now();
  }
  pbuf_free(p);
}

static void
ping_timeout(void *arg)
{
  struct raw_pcb *pcb = (struct raw_pcb*)arg;
  ip_addr_t ping_target = PING_TARGET;
  
  LWIP_ASSERT("ping_timeout: no pcb given!", pcb != NULL);

  ping_send(pcb, &ping_target);

  sys_timeout(PING_DELAY, ping_timeout, pcb);
}

static void
ping_raw_init(void)
{
  ping_pcb = raw_new(IP_PROTO_ICMP);
  LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL);

  raw_recv(ping_pcb, ping_recv, NULL);
  raw_bind(ping_pcb, IP_ADDR_ANY);
  sys_timeout(PING_DELAY, ping_timeout, ping_pcb);
}

void
ping_send_now()
{
  ip_addr_t ping_target = PING_TARGET;
  LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL);
  ping_send(ping_pcb, &ping_target);
}

#endif /* PING_USE_SOCKETS */

void
ping_init(void)
{
#if PING_USE_SOCKETS
  sys_thread_new("ping_thread", ping_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
#else /* PING_USE_SOCKETS */
  ping_raw_init();
#endif /* PING_USE_SOCKETS */
}

#endif /* LWIP_RAW */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产成人在线影院| 99久久亚洲一区二区三区青草| 懂色av一区二区三区免费观看| 欧美日韩精品一区视频| 国产精品网曝门| 成人激情午夜影院| 久久久99精品久久| 久久精品999| 色香蕉久久蜜桃| 日韩三级在线免费观看| 午夜精品久久久久影视| 欧美视频日韩视频| 丝袜脚交一区二区| 91麻豆精品国产91久久久资源速度 | 一本一本大道香蕉久在线精品| 国产欧美精品一区二区三区四区 | 中文字幕不卡三区| 成人免费视频一区| 国产精品第五页| 精品1区2区3区| 日本午夜一区二区| 精品电影一区二区| 成人毛片在线观看| 中文字幕一区二区日韩精品绯色| av在线综合网| 日本在线观看不卡视频| 国产亚洲一区二区三区四区| 色婷婷国产精品| 久色婷婷小香蕉久久| 中文在线资源观看网站视频免费不卡| 91在线国产观看| 毛片基地黄久久久久久天堂| 国产精品的网站| 6080国产精品一区二区| 99久久精品一区| 国内精品不卡在线| 亚洲综合一区在线| 国产欧美一区二区三区在线老狼| 日本午夜精品一区二区三区电影| 久久亚洲私人国产精品va媚药| av亚洲精华国产精华精| 亚洲一区二区三区爽爽爽爽爽| 精品久久免费看| 一本色道久久综合亚洲91| 美女精品自拍一二三四| 中文字幕亚洲在| 午夜欧美大尺度福利影院在线看| 95精品视频在线| 亚洲国产三级在线| 欧美一区国产二区| 粉嫩av亚洲一区二区图片| 久久夜色精品国产欧美乱极品| 夫妻av一区二区| 一区二区高清视频在线观看| 国产一区999| 国产精品久线在线观看| 色综合久久久久综合体| 亚洲成在人线在线播放| 久久久久国色av免费看影院| 美女被吸乳得到大胸91| 欧美激情在线一区二区| 色天天综合久久久久综合片| 蜜桃视频第一区免费观看| 欧美韩国日本不卡| 欧美美女直播网站| 国产成人在线电影| 免费成人美女在线观看.| 精品一区二区三区视频| 精品视频在线视频| 国产精品亚洲一区二区三区在线 | 亚洲一区二区三区视频在线播放 | 亚洲私人影院在线观看| 日韩女优毛片在线| 色偷偷88欧美精品久久久| 精品中文字幕一区二区小辣椒| 欧美国产综合一区二区| 26uuu精品一区二区三区四区在线| 91猫先生在线| 在线亚洲精品福利网址导航| 97久久超碰国产精品| 亚洲综合一区二区精品导航| 久久久久久久网| 日韩一区和二区| 欧美午夜精品久久久久久孕妇| 成人性视频免费网站| 国产福利一区在线| 国产一区二区主播在线| 风流少妇一区二区| 国内不卡的二区三区中文字幕| 老司机精品视频在线| 欧美aaaaaa午夜精品| 久久色成人在线| 自拍偷拍亚洲激情| 91国偷自产一区二区开放时间 | 久久99精品久久久久| 亚洲国产成人av网| 国产精品2024| 欧美人动与zoxxxx乱| 欧美精品一区二区蜜臀亚洲| 自拍偷拍欧美激情| 精品在线你懂的| 91免费版pro下载短视频| 91污在线观看| 91免费版在线| 欧美—级在线免费片| 亚洲欧美激情插| 国产精品亚洲午夜一区二区三区 | 男人的天堂久久精品| 欧美一区三区四区| 在线观看中文字幕不卡| 成人污污视频在线观看| 不卡av在线免费观看| 久久精品噜噜噜成人88aⅴ| 不卡影院免费观看| 在线日韩av片| 精品奇米国产一区二区三区| 欧美国产综合一区二区| 午夜久久久久久电影| 国产电影一区在线| 日韩欧美一区二区视频| 91精品午夜视频| 亚洲人成伊人成综合网小说| 久久精品国产亚洲5555| 色欧美乱欧美15图片| 国产三级一区二区| 亚洲国产中文字幕在线视频综合| 国产一区二区在线观看视频| 一区二区三区欧美视频| 99精品视频在线观看免费| 欧美美女黄视频| 亚洲欧美日韩中文播放| av在线一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲韩国一区二区三区| 91福利在线看| 亚洲欧美日韩国产综合在线 | 婷婷国产在线综合| 欧美综合天天夜夜久久| 亚洲精品国产一区二区精华液| 成人丝袜视频网| 日韩伦理av电影| 日本一区二区电影| 国产乱人伦偷精品视频免下载| 欧美日韩黄色一区二区| 蜜桃av噜噜一区| 中文字幕一区二区三区四区不卡| 91一区二区三区在线播放| 一区二区三区不卡视频| 久久久久国产精品厨房| 成人激情视频网站| 久久99精品一区二区三区三区| 国产成人在线免费观看| 亚洲国产一区二区三区青草影视 | 精品va天堂亚洲国产| 理论片日本一区| 亚洲一区在线观看网站| 国产拍揄自揄精品视频麻豆| 91精品国产欧美日韩| 91久久精品一区二区| 国产黄色91视频| 麻豆精品精品国产自在97香蕉| 亚洲一区二区三区四区五区黄| 国产精品久久久久久久久快鸭| 精品国产一区二区三区四区四 | 国产很黄免费观看久久| 麻豆91在线播放免费| 日韩国产在线观看| 日韩中文字幕区一区有砖一区| 亚洲欧美福利一区二区| 亚洲视频一二三| 亚洲综合另类小说| 亚洲国产精品久久一线不卡| 亚洲人成人一区二区在线观看| 国产精品久久久一本精品| 国产精品欧美一区喷水| 亚洲欧美日韩一区二区三区在线观看| 久久精品人人做| 最新国产成人在线观看| 亚洲六月丁香色婷婷综合久久| 亚洲一区二区高清| 日韩精品91亚洲二区在线观看| 蜜桃一区二区三区在线观看| 天堂影院一区二区| 国产伦理精品不卡| 蜜桃av噜噜一区二区三区小说| 国产黄色91视频| 大胆亚洲人体视频| av不卡在线观看| 欧美第一区第二区| 国产精品久久三| 老司机午夜精品99久久| 国产成人精品网址| 欧美群妇大交群中文字幕| 久久色成人在线| 五月天久久比比资源色| 精品一区二区久久| 欧美色视频一区| 久久精品视频免费观看| 奇米精品一区二区三区四区| 成人福利视频网站|