그래서 원시 소켓을 copypasta로 설정하고, 데이터를 보내고, 그 부분은 잘 작동합니다. 하지만 소켓을 통해 데이터를 보내려면 어떻게해야합니까? 도움이된다면 DNS 요청을하려고합니다. 아래 코드.UDP Raw Socket set 메시지
int main(int argc, char *argv[])
{
if (!argv[1])
{
printf("Target not specified!\nUsage: ");
printf(argv[0]);
printf(" <target>\n");
exit(1);
}
struct ip ip;
struct udphdr udp;
int sd;
const int on = 1;
struct sockaddr_in sin;
//char msg[] = "\x03\xF0\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01";
u_char *packet;
packet = (u_char *)malloc(120);
ip.ip_hl = 0x5;
ip.ip_v = 0x4;
ip.ip_tos = 0x0;
ip.ip_len = 60;
ip.ip_id = htons(12830);
ip.ip_off = 0x0;
ip.ip_ttl = 64;
ip.ip_p = IPPROTO_UDP;
ip.ip_sum = 0x0;
ip.ip_src.s_addr = inet_addr(argv[1]);
ip.ip_dst.s_addr = inet_addr("67.228.44.4");
ip.ip_sum = in_cksum((unsigned short *)&ip, sizeof(ip));
memcpy(packet, &ip, sizeof(ip));
udp.source = htons(80);
udp.dest = htons(53);
udp.len = htons(22);
udp.check = 0;
udp.check = in_cksum_udp(ip.ip_src.s_addr, ip.ip_dst.s_addr, (unsigned short *)&udp, sizeof(udp));
memcpy(packet + 20, &udp, sizeof(udp));
if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("raw socket");
exit(1);
}
if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ip.ip_dst.s_addr;
if (sendto(sd, packet, 120, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)
{
perror("sendto");
exit(1);
}
}
'sendto'의 마지막 인수는'sizeof (struct sockaddr_in)'이 아니어야합니까? –
그게 사실 일지 모르지만, 그것은 정말로 내 문제에 relavent 아니며, 그것을 가지고있는 방식으로 잘 작동합니다, 나는 단지 메시지를 설정하는 방법을 알고 싶습니다. – W00t
왜 UDP 소켓이 아닌 RAW 소켓을 사용하고 있습니까? 그리고 나는 당신이 무엇을 요구하고 있는지 분명하지 않습니다 ... 당신은 보내는 부분이 일하고 있다고 말합니다. 그렇다면 "메시지를 정하십시오"라는 것은 무엇을 의미합니까? – EdwardH