Sockets sendto()函数出错:参数错误无效
我正在为linux编写ping CLI程序,并且在sendto()函数中收到错误22:invalid参数。我不明白为什么,所有的论点似乎都是正确的 下面是我调用函数的地方: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
// 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)