Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets sendto()函数出错:参数错误无效_Sockets_Network Programming_Ping_Invalid Argument_Sendto - Fatal编程技术网

Sockets sendto()函数出错:参数错误无效

Sockets sendto()函数出错:参数错误无效,sockets,network-programming,ping,invalid-argument,sendto,Sockets,Network Programming,Ping,Invalid Argument,Sendto,我正在为linux编写ping CLI程序,并且在sendto()函数中收到错误22:invalid参数。我不明白为什么,所有的论点似乎都是正确的 下面是我调用函数的地方: // send echo request bytesSent = sendto(socketFD, // socket file descriptor (c

我正在为linux编写ping CLI程序,并且在sendto()函数中收到错误22:invalid参数。我不明白为什么,所有的论点似乎都是正确的

下面是我调用函数的地方:

    // send echo request
    bytesSent = sendto(socketFD,                                                        // socket file descriptor
                      (char*)&packet, PacketSize,                                       // packet and size
                      0,                                                                // flags
                      (sockaddr*)DestinationAddr, (socklen_t)sizeof(DestinationAddr));  // destination address and size
“数据包”如下所示: (我在调用sendto()的函数中调用InitializePackage())

“DestinationAddress”是指:

    // variables needed to store IP Address
    addrinfo* result;
    sockaddr_in* DestinationAddr;
    char ipString[INET_ADDRSTRLEN];

    // get IP Address and store in result (passed by reference)
    if (getIPAddress(argv[1], result) != 0) {
        std::cout << "Invalid IP Address. Terminating ...\n";
        exit(EXIT_FAILURE);
    }
    else {
        DestinationAddr = (sockaddr_in*)result->ai_addr;                        // get struct from resulting linked list
        void* address;
        address = &DestinationAddr->sin_addr;                                   // store IP Address
        inet_ntop(result->ai_family, address, ipString, sizeof(ipString));      // convert binary IP to string
        std::cout << "IP: " << ipString << std::endl;
    }

PortNo定义为:
const char PortNo='0'

根据文档:

通过使用协议IPPROTO_ICMP打开原始套接字,用户协议可以接收所有本地套接字的ICMP数据包

因此,请尝试这样创建套接字:

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

而且,如果遇到EPERM错误,请以root用户身份运行程序。

根据文档:

通过使用协议IPPROTO_ICMP打开原始套接字,用户协议可以接收所有本地套接字的ICMP数据包

因此,请尝试这样创建套接字:

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

而且,如果遇到EPERM错误,请以root用户身份运行程序。

为什么要尝试通过UDP发送ICMP数据包?@user207421我这样做是因为UDP不需要在发送数据之前建立连接,并且在需要速度时最适合,所以我认为这是最好的。为什么你要尝试通过UDP发送ICMP数据包?@user207421我这样做是因为UDP不需要在发送数据之前建立连接,并且在需要速度时它最适合,所以我认为这是最好的。我最初做过:
socket(PF_INET,SOCK_RAW,IPPROTO_ICMP)
我也尝试过这样做,但它给出了相同的错误。(错误22)请阅读。下面是一个示例实现:我能够找到错误。这是因为我对指针DestinationAddr调用了sizeof(),我取消了对它的引用,无效参数错误消失了。现在,它成功地发送数据(sendto()返回64),但不接收数据。超时导致它结束,如果我删除超时,那么它只会继续等待数据。(给出了错误11(资源暂时不可用)我最初是这样做的:
socket(PF_INET,SOCK_RAW,IPPROTO_ICMP)
我也尝试过这样做,但它给出了相同的错误。(错误22)请阅读。下面是一个示例实现:我能够找到错误。这是因为我对指针DestinationAddr调用了sizeof(),我取消了对它的引用,无效参数错误消失了。现在,它成功地发送数据(sendto()返回64),但不接收数据。超时导致它结束,如果我删除超时,那么它只会继续等待数据。(给出了错误号11(资源暂时不可用)
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)