代码之家  ›  专栏  ›  技术社区  ›  William FitzPatrick

IcmpSendEcho函数示例代码未编译

  •  0
  • William FitzPatrick  · 技术社区  · 5 年前

    编辑: 谢谢雷米·勒博和汉斯·帕桑。 替换“ > “与” > “解决了部分问题。以下是方法” > 显示时不带代码示例格式:“>”。

    故事的寓意: 从internet复制/粘贴代码时要小心

    剩下的问题是,30多天前编写的Microsoft ICMP示例代码使用了折旧后的命令。解决方法如下: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS

    更正后的代码:

    #include <winsock2.h>
    #include <iphlpapi.h>
    #include <icmpapi.h>
    #include <stdio.h>
    #pragma comment(lib, "iphlpapi.lib")
    #pragma comment(lib, "ws2_32.lib")
    
    
    int __cdecl main(int argc, char **argv) {
        // Declare and initialize variables
    
        HANDLE hIcmpFile;
        unsigned long ipaddr = INADDR_NONE;
        DWORD dwRetVal = 0;
        char SendData[32] = "Data Buffer";
        LPVOID ReplyBuffer = NULL;
        DWORD ReplySize = 0;
    
    
        // Validate the parameters
        if (argc != 2) {
            printf("usage: %s IP address\n", argv[0]);
            return 1;
        }
    
        ipaddr = inet_addr(argv[1]);
        if (ipaddr == INADDR_NONE) {
            printf("usage: %s IP address\n", argv[0]);
            return 1;
        }
    
        hIcmpFile = IcmpCreateFile();
        if (hIcmpFile == INVALID_HANDLE_VALUE) {
            printf("\tUnable to open handle.\n");
            printf("IcmpCreatefile returned error: %ld\n", GetLastError());
            return 1;
        }
    
        ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
        ReplyBuffer = (VOID*)malloc(ReplySize);
        if (ReplyBuffer == NULL) {
            printf("\tUnable to allocate memory\n");
            return 1;
        }
    
    
        dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
            NULL, ReplyBuffer, ReplySize, 1000);
        if (dwRetVal != 0) {
            PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
            struct in_addr ReplyAddr;
            ReplyAddr.S_un.S_addr = pEchoReply -> Address;
            printf("\tSent icmp message to %s\n", argv[1]);
            if (dwRetVal > 1) {
                printf("\tReceived %ld icmp message responses\n", dwRetVal);
                printf("\tInformation from the first response:\n");
            }
            else {
                printf("\tReceived %ld icmp message response\n", dwRetVal);
                printf("\tInformation from this response:\n");
            }
            printf("\t  Received from %s\n", inet_ntoa(ReplyAddr));
            printf("\t  Status = %ld\n",
                pEchoReply -> Status);
            printf("\t  Roundtrip time = %ld milliseconds\n",
                pEchoReply -> RoundTripTime);
        }
        else {
            printf("\tCall to IcmpSendEcho failed.\n");
            printf("\tIcmpSendEcho returned error: %ld\n", GetLastError());
            return 1;
        }
        return 0;
    }
    

    编译器输出:

    1>------ Build started: Project: Project2, Configuration: Debug Win32 ------
    
    
    1>Source.cpp
    
    
    1>source.cpp(26): error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
    
    
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\winsock2.h(1831): note: see declaration of 'inet_addr'
    
    
    1>source.cpp(62): error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
    
    
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\winsock2.h(1849): note: see declaration of 'inet_ntoa'
    
    
    1>Done building project "Project2.vcxproj" -- FAILED.
    
    
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    
    0 回复  |  直到 5 年前