我有一个程序尝试使用原始套接字在C中发送ICMP数据包。但是,每次发送ICMP数据包时,都会收到来自$(document).ready(function() {
var textarea = $("#my_textarea");
textarea.keydown(function(event) {
var numbOfchars = textarea.val();
var len = Math.min(numbOfchars.length, 10);
$(".chars-counter").text(len);
});
});
的错误,sendto
这是主要部分:
Invalid argument.
这是发生错误的函数:
int main(int argc, char *argv[])
{
if (argc != 3)
{
fprintf(stderr, "Usage: ./main [src] [dst]\n");
return -1;
}
struct sockaddr_in src, dst;
memset(&src, 0, sizeof(struct sockaddr_in));
memset(&dst, 0, sizeof(struct sockaddr_in));
inet_pton(AF_INET, argv[1], &src.sin_addr);
inet_pton(AF_INET, argv[2], &dst.sin_addr);
int s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (s == -1)
{
perror("socket");
return -1;
}
void *pkt = create_pkt(&src, &dst, IPPROTO_ICMP);
if (!pkt)
{
close(s);
return -1;
}
send_pkt(s, pkt, sizeof(ICMP) + sizeof(IP), &dst);
return 0;
}
我知道我的系统上启用了原始套接字(我正在使用Ubuntu 16.04),我还尝试了void send_pkt(int s, void *pkt,
int size, struct sockaddr_in *dst)
{
if (sendto(s, pkt, size, 0,
(struct sockaddr *) dst, sizeof(struct sockaddr)) == -1)
{
perror("sendto");
return;
}
}
中包含IP目标地址的值,但没有任何结果发生重大变化。结果,我离开了dst
和dst->sin_port = 0
。
如果有人能说清楚为什么这不起作用,我将不胜感激。
答案 0 :(得分:1)
使用原始套接字,如果IP头中的任何字段不正确,sendto
将返回错误。在我的情况下,我切换了IHL和版本的定位(由于端点问题,我将它们组合成一个字段)。因此,故事的道德:如果您收到原始套接字的sendto: Invalid argument
错误,请务必检查IP标头,而不仅仅是sendto
的目标结构。