Windows7/10實現ICMP(ping命令)

  如果覺得本文如果幫到你或者你想轉載都可以,只需要標註出處即可。謝謝

 利用ICMP數據包、C語言實現Ping命令程序,能實現基本的Ping操作,發送ICMP回顯請求報文,用於測試—個主機到只一個主機之間的連通情況。通過本程序的訓練,熟悉ICMP報文結構,對ICMP有更深的理解,掌握Ping程序的設計方法,掌握網絡編程的方法和技巧,從而編寫出功能更強大的程序。有關traceroute如果有時間我會也寫一篇來進行講解.W

  windows和Linux實現ping的底層思想一樣的,代碼有細微的差別。如文文件不一樣,參數定義不一樣等。所以我們要實現ping功能的時候我們需要注意是在Windows上實現還是Linux上實現。

  如果你不想看關於ping命令實現的原理,則可以直接通過以下目錄跳轉到‘8.實現Ping功能’即可.

  本文目錄

  1.ICMP簡介

  2.ICMP工作原理

  3.ICMP報文格式

  4.ICMPv4類型

    4.1響應請求/應答(ping)

    4.2.目標不可到達、源抑制和超時報文

  5.ICMP應用

  6.ICMP攻擊與防禦方法

  7.IP報文頭和ICMP的聯繫

  8.實現Ping功能

    8.1.ping實現步驟

    8.2.結果及心得

    8.3.完整代碼

1.ICMP簡介

  ICMP(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。

 ICMP協議是一種面向無連接的協議,用於傳輸出錯報告控制信息。它是一個非常重要的協議,它對於網絡安全具有極其重要的意義。

  ICMP報文通常是由IP層本身、上層的傳輸協議(TCP或UDP)甚至某些情況下用戶應用除法執行的。

  ICMP報文是在IP數據報內被封裝傳輸的。

  ICMP分為兩大類:有關IP數據報傳遞的ICMP報文(稱為差錯報文(error message)),以及有關信息採集和配置的ICMP報文(稱為查詢(query)或者信息類報文(informational message))。

  注:ICMP並不為IP網絡提供可靠性。相反,它表明了某些類別的故障和配置信息。

2.ICMP工作原理

  ICMP提供一致易懂的出錯報告信息。發送的出錯報文返回到發送原數據的設備,因為只有發送設備才是出錯報文的邏輯接受者。發送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由發送方完成。

  我們在網絡中經常會使用到ICMP協議,比如我們經常使用的用於檢查網絡通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協議工作的過程。還有其他的網絡命令如跟蹤路由的Tracert命令也是基於ICMP協議的。

3.ICMP報文格式

  ICMP報文包含在IP數據報中,屬於IP的一個用戶,IP頭部就在ICMP報文的前面,所以一個ICMP報文包括IP頭部、ICMP頭部和ICMP報文,IP頭部的Protocol值為1就說明這是一個ICMP報文,ICMP頭部中的類型(Type)域用於說明ICMP報文的作用及格式,此外還有一個代碼(Code)域用於詳細說明某種ICMP報文的類型,所有數據都在ICMP頭部後面。

  ICMPICMP報文格式具體由[RFC777][RFC792]規範。792是1981年9月更新,而777是1981年4月更新的。目前最新的ICMP報文格式RFC是2007年4月更新的[RFC488].

 

4.ICMPv4類型

  已經定義的ICMP消息類型大約有10多種,每種ICMP數據類型都被封裝在一個IP數據包中。主要的ICMP消息類型包括以下幾種。

  對於ICMPv4,信息類報文包括回顯請求和回顯應答(分別為類型8和0),以及路由器通告和路由器請求(分別為類型9和10,統一被稱為路由器發現)。最常見的差錯報文類型包括目的不可達(類型3)、重定向(類型5)、超時(類型11)和參數問題(類型12).下圖為一些類型.更多的信息建議去RFC官方查看,Type和Code在IPv4和IPc6不盡相同,所以其中的差異需要我們自行去查看,本圖為IPv4版本的,IPv6需要我們自己RFC查找。

 

1).響應請求/應答(ping)(ICMPv4類型為0/8,ICMPv6類型129/18)

  我們日常使用最多的ping,就是響應請求(Type=8)和應答(Type=0),一台主機向一個節點發送一個Type=8的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這台主機存在,更詳細的tracert通過計算ICMP報文通過的節點來確定主機與目標之間的網絡距離。更多的信息我們可以通過RFC文檔了解

 

2).目標不可到達(ICMPv4類型3,ICMPv6類型1)、源抑制和超時報文(ICMPv4類型11,ICMPv6類型4)

  這三種報文的格式是一樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞數據報時使用,例如我們要連接對方一個不存在的系統端口(端口號小於1024)時,將返回Type=3、Code=3的ICMP報文,它要告訴我們:“嘿,別連接了,我不在家的!”,常見的不可到達類型還有網絡不可到達(Code=0)、主機不可到達(Code=1)、協議不可到達(Code=2)等。源抑制則充當一個控制流量的角色,它通知主機減少數據報流量,由於ICMP沒有恢復傳輸的報文,所以只要停止該報文,主機就會逐漸恢復傳輸速率。最後,無連接方式網絡的問題就是數據報會丟失,或者長時間在網絡遊盪而找不到目標,或者擁塞導致主機在規定時間內無法重組數據報分段,這時就要觸發ICMP超時報文的產生。超時報文的代碼域有兩種取值:Code=0表示傳輸超時,Code=1表示重組分段超時。更多的信息我們可以通過RFC文檔了解

 

5.ICMP應用

1).ping 命令使用 ICMP 回送請求和應答報文在網絡可達性測試中使用的分組網間探測命令 ping 能產生 ICMP 回送請求和應答報文。目的主機收到 ICMP 回送請求報文後立刻回送應答報文,若源主機能收到 ICMP 回送應答報文,則說明到達該主機的網絡正常。

2).路由分析診斷程序 tracert 使用了 ICMP時間超過報文tracert 命令主要用來显示數據包到達目的主機所經過的路徑。通過執行一個 tracert 到對方主機的命令,返回數據包到達目的主機所經歷的路徑詳細信息,並显示每個路徑所消耗的時間。

 

6.ICMP攻擊

  涉及ICMP的攻擊主要分為3類:泛洪(flood)、炸彈(bomb)、信息泄露(information disclosure).針對TCP的ICMP攻擊已經被專門記錄在RFC文檔中[RFC5927]

1).泛洪(flood)

  泛洪將會生成大量流量,導致針對一台或者多台計算機的有效Dos攻擊

2).炸彈(bomb)

  炸彈類型有時也稱為核彈(nuke)類型,指的是發送經過特殊構造的報文,能夠導致IP或ICMP的處理崩潰或者終止。

3).信息泄露(information disclosure)

  信息泄露攻擊本身不會造成危害,但是能夠幫助其他攻擊方法避免浪費時間或者被發現了。

7.IP報文頭和ICMP的聯繫

  ICMP報文是封裝在IP數據報的數據部分中進行傳輸的.

 

  ICMP依靠IP來完成它的任務,它是IP的主要部分。它與傳輸協議(如TCP和UDP)顯著不同:它一般不用於在兩點間傳輸數據。它通常不由網絡程序直接使用,除了 ping 和 traceroute 這兩個特別的例子。 IPv4中的ICMP被稱作ICMPv4,IPv6中的ICMP則被稱作ICMPv6。

 

  總的來說,ICMP是封裝在IP數據報中進行傳輸的.具體更多的聯繫我們通過以下改文章進行詳解,從Wireshark抓包然後分析數據包進行兩者的區別和聯繫.

  參考文檔:https://www.cnblogs.com/CSAH/p/13170860.html

8.實現Ping功能

  首先我們注意,本文只是實現ping的最簡單的功能即響應請求/應答(ping),故只能夠ping IP地址,不能夠ping 域名,因為域名到IP地址我們需要經過DNS解析,本文不實現該功能.關於DNS轉換到IP地址的詳情,有時間有機會我會補上的.

  本程序使用的環境是win10+vc++6.0,如果沒有安裝VC++6.0的或者在Win10安裝了無法使用的請查看’Win10安裝vc6.0教程‘。

  ping功能實現參考了TCP/IP詳解 卷1 和 卷2。

1).實現步驟

  首先,我們需要先定義初始化一些全局變量,接着我們對需要用到的數據類型結構進行聲明定義,我們包含的數據類型結構有IP報頭結構、ICMP數據類型結構、結果集類型結構等;對需要使用到的函數進行頭文件的導入,主要的區別在於使用的是Windows系統還是Linux系統,導入的頭文件也不盡相同。準備工作全都完成了,然後我們就可以定義main函數進行試驗的驗證測試。

  其次,我們需要對每一步的遇到的問題需要寫一份說明報告書,以防下次再進行實驗時遇到同樣的問題時,我們無需再去查找大量資料。

  最後,我們對整個實驗的總結,對每一步。每一個函數進行詳講.做好註釋.

  Ping()函數是本程序的核心部分,它基本是調用其他模塊的函數來實現最終功能,其主要布驟包括:定義及初始化各個全局變量、打開socket動態庫、設置接收和發送超時值、域名地址解析、分配內存、創建及初始化ICMP報文、發送ICMP請求報文、接收ICMP 應答報文以及解讀應答報文和輸出Ping結果。

 

  注意:創建套接字的時候參數的以及在創建套接字之前必須首先使用WSAStartup函數。

(1)輸入時不能輸入目標主機名,不然ping結果為TIMEOUT

 

(2)該模塊並非只有處理還包括判斷及輸出判斷結果的含義

(3)程序沒運行一次就只能輸出四行結果(前提是輸入的地址有效),欲再次PING其他地址接着輸入下一個ip地址即可

 

2).代碼實現

    如果要想實現Windows下ping功能的實現,我們只需要從(1)到(8)複製到任意一個新創建filename.cpp文件中即可執行.或者最簡單的方法就是到本文中最低直接複製’完整代碼’到任意一個新創建filename.cpp文件中即可執行

(1).頭文件、全局變量

#include<stdio.h>
#include<Winsock2.h>
#include<ws2tcpip.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#pragma comment(lib , "Ws2_32.lib")

#define ICMP_ECHO_REQUEST 8 //定義回顯請求類型
#define DEF_ICMP_DATA_SIZE 20 //定義發送數據長度
#define DEF_ICMP_PACK_SIZE 32 //定義數據包長度
#define MAX_ICMP_PACKET_SIZE 1024 //定義最大數據包長度
#define DEF_ICMP_TIMEOUT 3000  //定義超時為3秒
#define ICMP_TIMEOUT 11 //ICMP超時報文
#define ICMP_ECHO_REPLY 0 //定義回顯應答類型

  

(2).IP報頭據類型

/*
 *IP報頭結構
 */
typedef struct
{
    byte h_len_ver ; //IP版本號
    byte tos ; // 服務類型
    unsigned short total_len ; //IP包總長度
    unsigned short ident ; // 標識
    unsigned short frag_and_flags ; //標誌位
    byte ttl ; //生存時間
    byte proto ; //協議
    unsigned short cksum ; //IP首部校驗和
    unsigned long sourceIP ; //源IP地址
    unsigned long destIP ; //目的IP地址
} IP_HEADER ;

  

(3).ICMP數據類型

/*
 *定義ICMP數據類型
 */
typedef struct _ICMP_HEADER
{
    byte type ; //類型-----8
    byte code ; //代碼-----8
    unsigned short cksum ; //校驗和------16
    unsigned short id ; //標識符-------16
    unsigned short seq ; //序列號------16
    unsigned int choose ; //選項-------32
} ICMP_HEADER ;

  

(4).ping返回結果集數據類型

typedef struct
{
    int usSeqNo ; //記錄序列號
    DWORD dwRoundTripTime ; //記錄當前時間
    byte ttl ; //生存時間
    in_addr dwIPaddr ; //源IP地址
} DECODE_RESULT ;

  

(5).網際校驗和

/*
 *產生網際校驗和
 */
unsigned short GenerateChecksum(unsigned short *pBuf , int iSize)
{
    unsigned long cksum = 0 ; //開始時將網際校驗和初始化為0
    while(iSize > 1)
    {
        cksum += *pBuf++ ; //將待校驗的數據每16位逐位相加保存在cksum中
        iSize -= sizeof(unsigned short) ; //每16位加完則將帶校驗數據量減去16
    }
    //如果待校驗的數據為奇數,則循環完之後需將最後一個字節的內容與之前結果相加
    if(iSize)
    {
        cksum += *(unsigned char*)pBuf ;
    }
        //之前的結果產生了進位,需要把進位也加入最後的結果中
    cksum = (cksum >> 16) + (cksum & 0xffff) ;
    cksum += (cksum >> 16) ;
    return (unsigned short)(~ cksum) ;
}

  

(6).ping信息解析

/*
 *對ping應答信息進行解析
 */
boolean DecodeIcmpResponse_Ping(char *pBuf , int iPacketSize , DECODE_RESULT *stDecodeResult)
{
    IP_HEADER *pIpHrd = (IP_HEADER*)pBuf ;
    int iIphedLen = 20 ;
    if(iPacketSize < (int)(iIphedLen + sizeof(ICMP_HEADER)))
    {
        printf("size error! \n") ;
        return 0 ;
    }
    //指針指向ICMP報文的首地址
    ICMP_HEADER *pIcmpHrd = (ICMP_HEADER*)(pBuf + iIphedLen) ;
    unsigned short usID , usSeqNo ;
    //獲得的數據包的type字段為ICMP_ECHO_REPLY,即收到一個回顯應答ICMP報文
    if(pIcmpHrd->type == ICMP_ECHO_REPLY)
    {
        usID = pIcmpHrd->id ;
        //接收到的是網絡字節順序的seq字段信息 , 需轉化為主機字節順序
        usSeqNo = ntohs(pIcmpHrd->seq) ;
    }
    if(usID != GetCurrentProcessId() || usSeqNo != stDecodeResult->usSeqNo)
    {
        printf("usID error!\n") ;
        return 0 ;
    }
    //記錄對方主機的IP地址以及計算往返的時延RTT
    if(pIcmpHrd->type == ICMP_ECHO_REPLY)
    {
        stDecodeResult->dwIPaddr.s_addr = pIpHrd->sourceIP ;
        stDecodeResult->ttl = pIpHrd->ttl ;
        stDecodeResult->dwRoundTripTime = GetTickCount() - stDecodeResult->dwRoundTripTime ;
        return 1 ;
    }
    return 0 ;
}

  

(7).ping功能實現集成

void Ping(char *IP)
{
   unsigned long ulDestIP = inet_addr(IP) ; //將IP地址轉化為長整形
   if(ulDestIP == INADDR_NONE)
   {
       //轉化不成功時按域名解析
       HOSTENT *pHostent = gethostbyname(IP) ;
       if(pHostent)
       {
           ulDestIP = (*(IN_ADDR*)pHostent->h_addr).s_addr ; //將HOSTENT轉化為長整形
       }
       else
       {
           printf("TIMEOUT\n") ;
           return ;
       }
   }
   //填充目的Socket地址
   SOCKADDR_IN destSockAddr ; //定義目的地址
   ZeroMemory(&destSockAddr , sizeof(SOCKADDR_IN)) ; //將目的地址清空
   destSockAddr.sin_family = AF_INET ;
   destSockAddr.sin_addr.s_addr = ulDestIP ;
   destSockAddr.sin_port = htons(0);
    //初始化WinSock
    WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    if(WSAStartup(wVersionRequested,&wsaData) != 0)
    {
        printf("初始化WinSock失敗!\n") ;
        return ;
    }
   //使用ICMP協議創建Raw Socket
   SOCKET sockRaw = WSASocket(AF_INET , SOCK_RAW , IPPROTO_ICMP , NULL , 0 , WSA_FLAG_OVERLAPPED) ;
   if(sockRaw == INVALID_SOCKET)
   {
       printf("創建Socket失敗 !\n") ;
       return ;
   }
   //設置端口屬性
   int iTimeout = DEF_ICMP_TIMEOUT ;
   if(setsockopt(sockRaw , SOL_SOCKET , SO_RCVTIMEO , (char*)&iTimeout , sizeof(iTimeout)) == SOCKET_ERROR)
   {
         printf("設置參數失敗!\n") ;
         return ;
   }
   if(setsockopt(sockRaw , SOL_SOCKET , SO_SNDTIMEO , (char*)&iTimeout , sizeof(iTimeout)) == SOCKET_ERROR)
   {
         printf("設置參數失敗!\n") ;
         return ;
   }
   //定義發送的數據段
   char IcmpSendBuf[DEF_ICMP_PACK_SIZE] ;
   //填充ICMP數據包個各字段
   ICMP_HEADER *pIcmpHeader  = (ICMP_HEADER*)IcmpSendBuf;
   pIcmpHeader->type = ICMP_ECHO_REQUEST ;
   pIcmpHeader->code = 0 ;
   pIcmpHeader->id = (unsigned short)GetCurrentProcessId() ;
   memset(IcmpSendBuf + sizeof(ICMP_HEADER) , 'E' , DEF_ICMP_DATA_SIZE) ;
   //循環發送四個請求回顯icmp數據包
   int usSeqNo = 0 ;
   DECODE_RESULT stDecodeResult ;
   while(usSeqNo <= 3)
   {
     pIcmpHeader->seq = htons(usSeqNo) ;
     pIcmpHeader->cksum = 0 ;
     pIcmpHeader->cksum = GenerateChecksum((unsigned short*)IcmpSendBuf , DEF_ICMP_PACK_SIZE) ; //生成校驗位
     //記錄序列號和當前時間
     stDecodeResult.usSeqNo = usSeqNo ;
     stDecodeResult.dwRoundTripTime = GetTickCount() ;
     //發送ICMP的EchoRequest數據包
     if(sendto(sockRaw , IcmpSendBuf , DEF_ICMP_PACK_SIZE , 0 , (SOCKADDR*)&destSockAddr , sizeof(destSockAddr)) == SOCKET_ERROR)
     {
        //如果目的主機不可達則直接退出
        if(WSAGetLastError() == WSAEHOSTUNREACH)
        {
            printf("目的主機不可達!\n") ;
            exit(0) ;
        }
     }
     SOCKADDR_IN from ;
     int iFromLen = sizeof(from) ;
     int iReadLen ;
     //定義接收的數據包
     char IcmpRecvBuf[MAX_ICMP_PACKET_SIZE] ;
     while(1)
     {
         iReadLen = recvfrom(sockRaw , IcmpRecvBuf , MAX_ICMP_PACKET_SIZE , 0 , (SOCKADDR*)&from , &iFromLen) ;
         if(iReadLen != SOCKET_ERROR)
         {
             if(DecodeIcmpResponse_Ping(IcmpRecvBuf , sizeof(IcmpRecvBuf) , &stDecodeResult))
             {
                printf("來自 %s 的回復: 字節 = %d 時間 = %dms TTL = %d\n" , inet_ntoa(stDecodeResult.dwIPaddr) ,
                         iReadLen - 20,stDecodeResult.dwRoundTripTime ,stDecodeResult.ttl) ;
             }
             break ;
         }
         else if(WSAGetLastError() == WSAETIMEDOUT)
         {
             printf("time out !  *****\n") ;
             break ;
         }
         else
         {
             printf("發生未知錯誤!\n") ;
             break ;
         }
     }
     usSeqNo++ ;
   }
   //輸出屏幕信息
   printf("Ping complete...\n") ;
   closesocket(sockRaw) ;
   WSACleanup() ;
}

  

①.inet_addr:可以轉化字符串,主要用來將一個十進制的數轉化為二進制的數,用途多於ipv4的IP轉化。

②.if(IpAddress == INADDR_NONE):INADDR_NONE 是個宏定義,代表IpAddress是否為無效的IP地址。

③.ckaddr_in:定義目的地址信息;

 

④.ZeroMemory:用0來填充一塊內存區域.ZeroMemory只能用於windows平台.

 

⑤.WSASocket:創建一個原始套接字。使用時需要包含winsock2.h 頭文件和鏈接ws2_32.lib庫。

⑥.SOCKET socket==INVALID_SOCKET:如果socket為無效套接字,則結果為true;

⑦.DEF_ICMP_TIMEOUT:報文超時時間.

⑧.setsockopt:選項影響套接口的操作,諸如加急數據是否在普通數據流中接收,廣播數據是否可以從套接口發送等等。

⑨.while(usSeqNo <= 3){}:該部分就是實驗要求我們一次測試的進行發包4次

(8).Test測試

int main(int argc , char* argv[])
{
   char  com[10] , IP[20] ;
   while(1){
   printf("command>>") ;
   scanf("%s %s" , com , IP) ;
   if(strcmp(com , "ping") == 0)
   {
       Ping(IP) ;
   }
   else
   {
       printf("輸入錯誤 ! \n") ;
   }
   }
   return 0 ;
}

  

2).結果及心得

(1).查看本機IP

 

(2).ping網關IP

 

(3).ping本機IP

 

(4).ping局域網內IP

 

(5).問題與解決方案

①.問題:telnet是23端口,ssh是22端口,那麼ping是什麼端口?

答:ping基於ICMP,是在網絡層運行的。而端口號為傳輸層的內容。所以在ICMP中根本就不需要關注端口號這樣的信息。

②.Win7、win10 在VC6.0運行時WSASocket 返回錯誤 10013

  

3).完整代碼

 

#include<stdio.h>
#include<Winsock2.h>
#include<ws2tcpip.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#pragma comment(lib , "Ws2_32.lib")


#define ICMP_ECHO_REQUEST 8 //定義回顯請求類型
#define DEF_ICMP_DATA_SIZE 20 //定義發送數據長度
#define DEF_ICMP_PACK_SIZE 32 //定義數據包長度
#define MAX_ICMP_PACKET_SIZE 1024 //定義最大數據包長度
#define DEF_ICMP_TIMEOUT 3000  //定義超時為3秒
#define ICMP_TIMEOUT 11 //ICMP超時報文
#define ICMP_ECHO_REPLY 0 //定義回顯應答類型
/*
 *IP報頭結構
 */
typedef struct
{
    byte h_len_ver ; //IP版本號
    byte tos ; // 服務類型
    unsigned short total_len ; //IP包總長度
    unsigned short ident ; // 標識
    unsigned short frag_and_flags ; //標誌位
    byte ttl ; //生存時間
    byte proto ; //協議
    unsigned short cksum ; //IP首部校驗和
    unsigned long sourceIP ; //源IP地址
    unsigned long destIP ; //目的IP地址
} IP_HEADER ;
/*
 *定義ICMP數據類型
 */
typedef struct _ICMP_HEADER
{
    byte type ; //類型-----8
    byte code ; //代碼-----8
    unsigned short cksum ; //校驗和------16
    unsigned short id ; //標識符-------16
    unsigned short seq ; //序列號------16
    unsigned int choose ; //選項-------32
} ICMP_HEADER ;


typedef struct
{
    int usSeqNo ; //記錄序列號
    DWORD dwRoundTripTime ; //記錄當前時間
    byte ttl ; //生存時間
    in_addr dwIPaddr ; //源IP地址
} DECODE_RESULT ;

/*
 *產生網際校驗和
 */
unsigned short GenerateChecksum(unsigned short *pBuf , int iSize)
{
    unsigned long cksum = 0 ; //開始時將網際校驗和初始化為0
    while(iSize > 1)
    {
        cksum += *pBuf++ ; //將待校驗的數據每16位逐位相加保存在cksum中
        iSize -= sizeof(unsigned short) ; //每16位加完則將帶校驗數據量減去16
    }
    //如果待校驗的數據為奇數,則循環完之後需將最後一個字節的內容與之前結果相加
    if(iSize)
    {
        cksum += *(unsigned char*)pBuf ;
    }
        //之前的結果產生了進位,需要把進位也加入最後的結果中
    cksum = (cksum >> 16) + (cksum & 0xffff) ;
    cksum += (cksum >> 16) ;
    return (unsigned short)(~ cksum) ;
}

/*
 *對ping應答信息進行解析
 */
boolean DecodeIcmpResponse_Ping(char *pBuf , int iPacketSize , DECODE_RESULT *stDecodeResult)
{
    IP_HEADER *pIpHrd = (IP_HEADER*)pBuf ;
    int iIphedLen = 20 ;
    if(iPacketSize < (int)(iIphedLen + sizeof(ICMP_HEADER)))
    {
        printf("size error! \n") ;
        return 0 ;
    }
    //指針指向ICMP報文的首地址
    ICMP_HEADER *pIcmpHrd = (ICMP_HEADER*)(pBuf + iIphedLen) ;
    unsigned short usID , usSeqNo ;
    //獲得的數據包的type字段為ICMP_ECHO_REPLY,即收到一個回顯應答ICMP報文
    if(pIcmpHrd->type == ICMP_ECHO_REPLY)
    {
        usID = pIcmpHrd->id ;
        //接收到的是網絡字節順序的seq字段信息 , 需轉化為主機字節順序
        usSeqNo = ntohs(pIcmpHrd->seq) ;
    }
    if(usID != GetCurrentProcessId() || usSeqNo != stDecodeResult->usSeqNo)
    {
        printf("usID error!\n") ;
        return 0 ;
    }
    //記錄對方主機的IP地址以及計算往返的時延RTT
    if(pIcmpHrd->type == ICMP_ECHO_REPLY)
    {
        stDecodeResult->dwIPaddr.s_addr = pIpHrd->sourceIP ;
        stDecodeResult->ttl = pIpHrd->ttl ;
        stDecodeResult->dwRoundTripTime = GetTickCount() - stDecodeResult->dwRoundTripTime ;
        return 1 ;
    }
    return 0 ;
}

void Ping(char *IP)
{
   unsigned long ulDestIP = inet_addr(IP) ; //將IP地址轉化為長整形
   if(ulDestIP == INADDR_NONE)
   {
       //轉化不成功時按域名解析
       HOSTENT *pHostent = gethostbyname(IP) ;
       if(pHostent)
       {
           ulDestIP = (*(IN_ADDR*)pHostent->h_addr).s_addr ; //將HOSTENT轉化為長整形
       }
       else
       {
           printf("TIMEOUT\n") ;
           return ;
       }
   }
   //填充目的Socket地址
   SOCKADDR_IN destSockAddr ; //定義目的地址
   ZeroMemory(&destSockAddr , sizeof(SOCKADDR_IN)) ; //將目的地址清空
   destSockAddr.sin_family = AF_INET ;
   destSockAddr.sin_addr.s_addr = ulDestIP ;
   destSockAddr.sin_port = htons(0);
    //初始化WinSock
    WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    if(WSAStartup(wVersionRequested,&wsaData) != 0)
    {
        printf("初始化WinSock失敗!\n") ;
        return ;
    }
   //使用ICMP協議創建Raw Socket
   SOCKET sockRaw = WSASocket(AF_INET , SOCK_RAW , IPPROTO_ICMP , NULL , 0 , WSA_FLAG_OVERLAPPED) ;
   if(sockRaw == INVALID_SOCKET)
   {
       printf("創建Socket失敗 !\n") ;
       return ;
   }
   //設置端口屬性
   int iTimeout = DEF_ICMP_TIMEOUT ;
   if(setsockopt(sockRaw , SOL_SOCKET , SO_RCVTIMEO , (char*)&iTimeout , sizeof(iTimeout)) == SOCKET_ERROR)
   {
         printf("設置參數失敗!\n") ;
         return ;
   }
   if(setsockopt(sockRaw , SOL_SOCKET , SO_SNDTIMEO , (char*)&iTimeout , sizeof(iTimeout)) == SOCKET_ERROR)
   {
         printf("設置參數失敗!\n") ;
         return ;
   }
   //定義發送的數據段
   char IcmpSendBuf[DEF_ICMP_PACK_SIZE] ;
   //填充ICMP數據包個各字段
   ICMP_HEADER *pIcmpHeader  = (ICMP_HEADER*)IcmpSendBuf;
   pIcmpHeader->type = ICMP_ECHO_REQUEST ;
   pIcmpHeader->code = 0 ;
   pIcmpHeader->id = (unsigned short)GetCurrentProcessId() ;
   memset(IcmpSendBuf + sizeof(ICMP_HEADER) , 'E' , DEF_ICMP_DATA_SIZE) ;
   //循環發送四個請求回顯icmp數據包
   int usSeqNo = 0 ;
   DECODE_RESULT stDecodeResult ;

   while(usSeqNo <= 3)
   {
     pIcmpHeader->seq = htons(usSeqNo) ;
     pIcmpHeader->cksum = 0 ;
     pIcmpHeader->cksum = GenerateChecksum((unsigned short*)IcmpSendBuf , DEF_ICMP_PACK_SIZE) ; //生成校驗位
     //記錄序列號和當前時間
     stDecodeResult.usSeqNo = usSeqNo ;
     stDecodeResult.dwRoundTripTime = GetTickCount() ;
     //發送ICMP的EchoRequest數據包
     if(sendto(sockRaw , IcmpSendBuf , DEF_ICMP_PACK_SIZE , 0 , (SOCKADDR*)&destSockAddr , sizeof(destSockAddr)) == SOCKET_ERROR)
     {
        //如果目的主機不可達則直接退出
        if(WSAGetLastError() == WSAEHOSTUNREACH)
        {
            printf("目的主機不可達!\n") ;
            exit(0) ;
        }
     }
     SOCKADDR_IN from ;
     int iFromLen = sizeof(from) ;
     int iReadLen ;
     //定義接收的數據包
     char IcmpRecvBuf[MAX_ICMP_PACKET_SIZE] ;
     while(1)
     {
         iReadLen = recvfrom(sockRaw , IcmpRecvBuf , MAX_ICMP_PACKET_SIZE , 0 , (SOCKADDR*)&from , &iFromLen) ;
         if(iReadLen != SOCKET_ERROR)
         {
             if(DecodeIcmpResponse_Ping(IcmpRecvBuf , sizeof(IcmpRecvBuf) , &stDecodeResult))
             {
                printf("來自 %s 的回復: 字節 = %d 時間 = %dms TTL = %d\n" , inet_ntoa(stDecodeResult.dwIPaddr) ,
                         iReadLen - 20,stDecodeResult.dwRoundTripTime ,stDecodeResult.ttl) ;
             }
             break ;
         }
         else if(WSAGetLastError() == WSAETIMEDOUT)
         {
             printf("time out !  *****\n") ;
             break ;
         }
         else
         {
             printf("發生未知錯誤!\n") ;
             break ;
         }
     }
     usSeqNo++ ;
   }
   //輸出屏幕信息
   printf("Ping complete...\n") ;
   closesocket(sockRaw) ;
   WSACleanup() ;
}
int main()
{
   char  com[10] , IP[20] ;
   while(1){
   printf("command>>") ;
   scanf("%s %s" , com , IP) ;
   if(strcmp(com , "ping") == 0)
   {
       Ping(IP) ;
   }
   else
   {
       printf("輸入錯誤 ! \n") ;
   }
   }
   return 0 ;
}

  

參考文檔:https://zhidao.baidu.com/question/1946506262344388308.html

https://docs.microsoft.com/zh-cn/windows/win32/api/winsock2/nf-winsock2-wsasocketa?redirectedfrom=MSDN

https://zhidao.baidu.com/question/541753723.html

TCP/IP網絡原理技術[清華大學出版社 周明天,汪文勇]

互聯網控制消息協議[維基百科]

TCP/IP詳解 卷1:協議

TCP/IP詳解 卷2:實現

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

一文讀懂:GBDT梯度提升

先縷一縷幾個關係:

  • GBDT是gradient-boost decision tree
  • GBDT的核心就是gradient boost,我們搞清楚什麼是gradient boost就可以了
  • GBDT是boost中的一種方法,boost還有XGBoost,adaboost。

基本概念

【Boost】就是讓多個弱分類器,通過不同的集成方式,來讓多個弱分類器變成一個強分類器。

【gradient-boost】 梯度提升。簡單的說,先訓練一個弱分類器,然後弱分類器和目標值之間的殘差,作為下一個弱分類器訓練的目標值。這裡有一個非常簡單的例子

  • 第一個模型預測年齡,雖然真實值是30歲,第一個模型只給出了20歲的估計值;
  • 第二棵樹要預測的就是這個10歲的殘差,但是第二棵樹只給出了6歲的估計值;
  • 第三棵樹預測的是第二棵樹的4歲的殘差,但是………………(禁止套娃)

梯度 or 殘差 ?

對於GBDT,網上的很多文章都沒有講清楚,學習梯度還是學習殘差?從上面的那個例子來看,是學習殘差的。

其實,從來GBDT都是學習梯度的,學習殘差只是學習梯度的一個特例!

如果我們是在做一個回歸任務(就像是上面例子中預測年齡),採用平方損失:\(loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}\)
其中\(y_i\)是真實數值,\(\hat{y_i}\)是模型預測的值。

然後想求取這個關於\(\hat{y_i}\)的梯度,那就是:
\(\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})\)

所以殘差在平方損失的情況下,就是等於負梯度,所以兩者一回事。

殘差過於敏感

對於數據不幹凈,沒有清晰掉異常值的數據樣本。使用平方損失對異常值過於敏感了

所以,這裡在回歸問題中,也可以考慮使用下面的兩個損失函數:

  • Absolute loss:
    \(loss=|y-\hat{y}|\)

  • Huber loss:
    這個是設置一個閾值,當\(|y-\hat{y}|\)小於這個閾值的時候,採用平方損失,當\(|y-\hat{y}|\)大於這個閾值的時候,採用類似於絕對損失的線性損失:

    這裏看一下huber loss的函數圖像:

    就是一個平方損失,一個線性損失。

然後看一下平方損失,絕對損失,huber損失對於異常值的容忍程度:

CART回歸樹分裂思路(可不看)

其實這個問題看起來問的不明所以,其實是問你決策樹如何選擇特徵的。從上面的例子可以看出來,GDBT應該是處理回歸問題的(處理連續數據的)。當然,GDBT也有辦法處理分類問題,只是這裏就不說了,這裏主要說GDBT怎麼處理回歸問題的,回歸問題能處理,那麼總有回歸離散化的辦法的

這個問題是在問:CART TREE如何選擇特徵的CART TREE就是回歸決策樹,就是之前提到的弱分類器。

一個決策樹,希望讀者已經有一個大概的理解了。簡單說就是:樣本可以根據的特徵A是否超過某一個閾值劃分成兩部分,然後劃分之後的每一個部分又可以根據某一個特徵是否超過某一個閾值再分成兩部分……

這樣我們就要做出選擇了:每一個部分是根據哪一個特徵去劃分?根據這個特徵的哪一個數值作為閾值劃分?

如果我們算力無窮,那麼自然可以遍歷每一個特徵,然後窮舉每一種可能的分割點,然後對比找到最優分割點。

那麼如何判斷分割的點的好壞呢?得給出一個cost函數,或者叫做loss函數這樣的東西吧。

\(loss= \sum_{第一部分}{(y_i-me an(y_{第一部分}))^2}+\sum_{第二部分}{(y_i-mean(y_{第二部分}))^2}\)

看一下這個公式,我把公式寫的太丑了。其實這個公式非常的好理解:現在根據某一個特徵值,根據某一個閾值把樣本分成了兩個部分:第一部分和第二部分。然後計算每一個部分的樣本的label的均值,也就是公式中的:\(mean(y_{第一部分})\),\(mean(y_{第二部分})\),然後計算第一部分中所有樣本的label與第一部分label均值之間的差的平方和,同樣的過程計算第二個部分的,兩個相加起來就是這個loss。選擇能夠讓這個loss最小的分割特徵和分割閾值,就是我們要找的東西。

其實我在學這一塊的時候,發現這個過程像是什麼?像不像聚類算法,通過上面的loss的最小化的過程,把一堆樣本分成兩類,讓兩類的類內距離最小。那個均值就像是求類中心點,計算每一個label距離類中心點的距離。(這一段看不懂也沒事

喜歡的話請關注我們的微信公眾號~【你好世界煉丹師】。

  • 公眾號主要講統計學,數據科學,機器學習,深度學習,以及一些參加Kaggle競賽的經驗。
  • 公眾號內容建議作為課後的一些相關知識的補充,飯後甜點。
  • 此外,為了不過多打擾,公眾號每周推送一次,每次4~6篇精選文章。

微信搜索公眾號:你好世界煉丹師。期待您的關注。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

熱浪席捲 澳洲全國均溫40.9度創新高

摘錄自2019年12月18日中央社報導

澳17日出現有紀錄以來最熱的一天,氣象局測到全國平均氣溫高達攝氏40.9度(華氏105.6度)。先前澳洲高溫紀錄為2013年1月時創下的攝氏40.3度。

在近日野火肆虐澳洲東岸,又有熱浪席捲各地,氣候狀況更形惡劣的情況下,高溫紀錄預料很快就會再寫新高。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

新柴油車微粒排放超標 歐洲環保團體籲從嚴限制

摘錄自2020年01月13日中央通訊社報導

總部在比利時的歐洲運輸環境聯合會今天(13日)表示,有些新款柴油車在清理濾清器時微粒排放量嚴重超標,呼籲歐洲議會議員制定更嚴格的排放檢測標準與規範。

德國福斯汽車(Volkswagen)在2018年歐洲地區銷售最佳的兩款柴油車執行檢測時發現,在定期進行清理車內防污濾清器的程序時,微粒污染程度恐飆到正常標準1000倍。

路透社報導,針對日產汽車(Nissan)Qashqai 與歐寶汽車(Opel)/ 沃豪汽車(Vauxhal)Astra兩款柴油車執行的檢測發現,自動清理濾清器時,微粒的排放量高於標準32%至115%。歐寶 / 沃豪的發言人表示,因不了解運輸環境聯合會所公布報告的細節,無法置評。

運輸環境聯合會表示,歐洲超過4500萬輛汽車安裝微粒濾清器,每年得清理濾清器13億次。清理的程序可能兩週就有一次,並可持續15公里距離。聯合會指出,根據歐盟現行法規,若是車子在官方檢測期間清理濾清器,檢測結果不列入統計,「也就是說,受檢測車輛所排放的微粒有60%至99%受到忽視」。

根據世界衛生組織(WHO),懸浮微粒對人們的影響比其他污染物更嚴重,另據歐洲環保署(European Environment Agency)指出,歐洲各大城市裡,有3/4居民暴露於不安全的懸浮微粒等級。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

氣候暖化影響冬眠 俄羅斯小獾提早甦醒

摘錄自2020年2月13日公視報導

受到暖冬影響,冬眠的動物提早甦醒,像是在俄羅斯,動物園裡的獾原本應該睡到月底,卻在月初就爬起來玩。

在俄羅斯西伯利亞城市伊爾庫茨克的動物園,發現有兩隻獾,在二月的第一週就醒來一起玩,牠們去年這時候還在冬眠,當時還跟往年作息一樣,睡到月底。助理獸醫史達茲卡雅表示:「牠們都是小獾,也就是新生代。成年的獾都還在睡覺,牠們冬眠會比較久。」

這個月10號,當地氣溫攝氏兩度,但去年的同一天,氣溫為零下24度。此外,動物園內這隻名為藍波的刺蝟,也在上週跑出來活動,園方表示,通常這表示春天就快到了,史達茲卡雅說:「動物比我們的感覺還要強,牠們更能適應大自然的改變,牠們也會比較早感覺得到。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

福島核污染物遭沖走外洩 韓國要求日本提供資料

摘錄自2019年10月21日自由時報報導

哈吉貝颱風侵襲日本,造成許多地區出現慘重水患,放置福島核電事故輻射污染物的臨時貯存場也遭大水淹沒,部分裝有輻射污染廢棄物的袋子沖入河中,輻射廢棄物不翼而飛,韓國核電安全委員會要求日本提供該事件相關資料。

據《韓聯社》報導,韓核電安全委員會委員長嚴在植21日透露,針對福島輻射污染物垃圾袋被沖走一事,已要求日本駐韓大使館提供相關資料,日前韓奧委會也在與國際奧會(IOC)主席巴赫(Thomas Bach)會談時,向巴赫提出福島輻射污染物洩漏事件,巴赫表示會計畫確認情況。

日本環境省表示,目前在河道的輻射量並沒有變化,認為這些流出的放射性物質濃度較低,對環境不會有影響。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

瑞士國會選舉初步預測 綠黨可望竄升成第4大黨

摘錄自2019年10月21日中央社報導

士國會大選投票20日落幕,初步預測顯示,瑞士人民黨可望拿下25.8%得票率蟬聯第一大黨。

瑞士廣播電視台(SRF)公布民調機構GFS Bern的預測結果,顯示綠黨(Green Party)有望在下議院選舉獲得13%選票,並從上屆選舉第5大黨竄升成為第4大黨。另一小黨綠色自由黨(Green Liberal Party,GLP)得票率則有7.9%。

路透社報導,如果綠黨與綠色自由黨克服政策分歧並決定團結合作,兩黨的得票率將逼近21%,甚至有望在最高行政機關聯邦委員會(Federal Council)7名委員中奪下一席。

根據政治研究機構索托莫研究所(Sotomo),氣候變遷取代移民政策,成為瑞士選民最關心的議題。這是瑞士近代政治史上,最顯著的轉變之一。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

颱風哈吉貝襲日滿月 農林漁損恐直逼西日本豪雨

摘錄自2019年11月12日中央社報導

颱風哈吉貝10月12日侵襲日本,到12日屆滿1個月,目前已知至少造成90人死亡、5人失蹤,目前掌握農林漁業損失已逾2200億日圓,未來可能直逼2018年西日本豪雨的逾3000億日圓。

哈吉貝10月12日從日本伊豆半島登陸侵襲東日本地區,日本經濟新聞報導,目前已知至少造成90人死亡、5人失蹤,將近300條河川流經區域發生水災,逾9萬棟民宅受災;如果從發生884起土石災害來看,這是從1982年以來,單一個颱風所造成的最慘重災情。

日本總務省消防廳表示,截至11日為止,全損或半損民宅超過1萬1000棟,淹水超過一樓地板高度的民宅超過3萬1000棟。

日本內閣府表示,截至8日為止,仍有約2800人在避難所生活,且還有不少人因為家中受災,只能暫時借住在親戚家中。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

亞洲訂單能見度佳 台廠第四季有望淡季不淡

雙反最終以定價定量收場,雖然結局讓台廠短期內並未受惠中國廠商的轉單效益。但法人表示,台廠在中歐貿易戰平息後,企業策略布局已進行新一波調整,重心除轉回到中國大陸內需市場,也著重於需求大增的日本及其他亞洲市場。

其中碩禾8月正銀的出貨量已正式突破3噸,且顧客需求活絡、訂單能見度佳,出貨量有望逐月放大。加上銀價隨著美國量化寬鬆政策訊息鈍化與出現反彈,正銀收益更加穩定。另外,碩禾子公司禾迅投資的日本永和電力,在日本簽訂約50億日圓電站業務合約,將在福島建置近17MW的電站,估計明年完工後,每年可貢獻售電收入約8億日圓的收益。

昱晶日前指出雙反時因應客戶拉貨的庫存已消化完畢,目前看來客戶對第四季需求沒有出現雜音,10月接單狀況佳,11、12月份的訂單應不會出現太大問題,整體表現可望與第三季相當。

中美晶在八月營收創新高後,也宣布著重綠能題材,積極以新技術搶攻油電混合車和純電動車市場,由於油電混合車和純電動車對於晶片的需求較傳統車用量高,隨著油價攀高、環保意識抬頭,也將推升未來公司的成長力道。

新日光在宣布合併旺能後,領域囊括太陽能電池、模組到終端的系統安裝,產能亦同步抬升。而新日光轉投資的系統安裝廠永旺日前爭取到國發基金補助,以永旺今年度在國內、外的安裝目標來看,可望帶來製造端之外的穩定成長動能。

隨著太陽能產業景氣回升,國內太陽能電池廠的接單能見度開始至10月向後延伸,一線大廠產能利用率皆仍能維持在高檔,第四季有望呈現淡季不淡的局面。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

中國高新汽車國際峰會 – 汽車行業思想領袖的國際峰會

第二屆中國高新汽車國際峰會由法蘭克福展覽(上海)公司和中國國家發展改革委員會國際合作中心聯合主辦,是真正國際化的高端會議,匯聚來自汽車行業的企業高管、中國政府高層官員和海外專家。    高峰會議程中將探討的關鍵主題包括:   ‧
促進中國國有和民營汽車企業的競爭力轉型:朝著真正合作、技術轉讓和全球市場渠道邁進   ‧
合併路線圖:如何盡可能擴大未來汽車行業的商業優勢
  ‧
混合動力機會評估:與電動汽車和輕量化ICE相比較
  ‧
通往電氣化的關鍵步驟:實現電動汽車和電動交通的真正發展
  ‧
汽車智聯技術創新實現新機會

  ‧
具備高增長潛力的未來配件市場機會:盈利發展   ‧
新型汽車市場定位:中西部地區與新興城市
 

數字營銷與社交媒體:OEM廠商和經銷商的最佳實踐
  ‧
有效減排:實現更加高效的商業車隊
  ‧
促進節能以及輕量化ICE的影響
  ‧
通過主動和被動方式,實現前所未有的駕駛者和車輛安全目標   ‧
輕量化實現更加節能、高性能的車型
  ‧
經銷商和分銷商在新維修市場中的新興機會   ‧
汽車融資和保險選項的演化和潛在新方向   ‧
展望未來:個人交通戰略與中國的未來生態城市相匹配   峰會誠邀候選演講嘉賓與主講嘉賓在2013年10月18日星期五之前提交演講提案。 峰會可提供的機會包括:思想領導力演講、企業高管訪談、互動小組討論、科技前沿和贊助活動。歡迎高層企業家參與主題演講,主題與演講機會有限,敬請報名。(請注意,演講提案並非僅限於上述主題,也歡迎您提供更多主題思路。)   提交程序   請在截止日期之前通過電子方式提交。請盡快從峰會官網下載「徵文申請表」,填寫並發回。所提交的所有申請表將由峰會議程組委會加以確認,並在評估階段提供反饋。 網址: http://www.nextgenautosummit-china.com/sc/Call_for_papers.html   Automechanika Shanghai上海汽配展毗鄰舉行 發揮絕佳的協同效應 Automechanika Shanghai上海國際汽車零部件、維修檢測診斷設備及汽車用品展覽會,將於2013年12月10至13日在毗連嘉裡大酒店的上海新國際博覽中心舉行。Automechanika Shanghai由法蘭克福展覽(上海)有限公司及中國汽車工業國際合作總公司聯合主辦,是規模僅次於德國法蘭克福母展的全球第二大Automechanika品牌展覽會,涵蓋汽車零部件、維修與保養、用 品及改裝三大行業板塊,涉及汽車原廠製造及售後市場的各 項產品及服務,整合汽車全產業鏈。預計展商數量超過4,400家,並將迎來8萬名海內外優質買家蒞臨,創歷屆展會之最。   垂詢與聯繫方式:    登記和綜合垂詢: Anna Gu 小姐 電話: +86 21 6160 8569 anna.gu@china.messefrankfurt.com   戰略合作機會: Keiann Yip 小姐 電話: +852 2230 9202 keiann.yip@hongkong.messefrankfurt.com   演講機會、贊助與檯面展示: Charlotte Chan 小姐 電話: +852 2111 3977 charlotte.chan@inspira-events.com    Michael Cherrington 先生 電話: +852 2111 3972 michael.cherrington@inspira-events.com   媒體垂詢: Rachelle Kong 電話: +852 2230 9226 rachelle.kong@hongkong.messefrankfurt.com  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心