首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendto()函数出错:参数无效错误

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

Stack Overflow用户
提问于 2020-05-29 03:57:19
回答 1查看 172关注 0票数 1

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

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

代码语言:javascript
复制
    // 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

‘'packet’看起来像这样:(我在调用sendto()的函数中调用initializePacket() )

代码语言:javascript
复制
struct PacketData {
    icmphdr header;
    char message[PacketSize - sizeof(header)];      // want total size to be 64 bytes
};

PacketData initializePacket(int &transmitted) {
    PacketData packet = {};

    packet.header.type = ICMP_ECHO;                 // set ICMP type to Echo
    packet.header.un.echo.id = getpid() & 0xFFFF;   // set id (ICMP field is 16 bits)
    packet.header.checksum = 0;                     // fixed checksum because data is unchanging
    packet.header.un.echo.sequence = transmitted++;

    // fill up message
    memset(&packet.message, '0', sizeof(packet.message));
    packet.message[PacketSize - sizeof(packet.header) - 1] = '\0';

    return packet;
}

'DestinationAddr‘是这样的:

代码语言:javascript
复制
    // 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;
    }

getIPAddress()函数是:

代码语言:javascript
复制
int getIPAddress(char* hostName, addrinfo* &result) {
    addrinfo tempStruct = {0};

    tempStruct.ai_family = AF_INET;         // want IPv4
    tempStruct.ai_socktype = SOCK_DGRAM;    // set socket type to datagram
    tempStruct.ai_flags = AI_PASSIVE;       // fill in IP automatically

    // get and validate IP address
    return (getaddrinfo(hostName, &PortNo, &tempStruct, &result));
}

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-29 15:55:51

根据文档icmp

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

分组。

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

代码语言:javascript
复制
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62073463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档