C UDP原始套接字集消息

C UDP原始套接字集消息,c,linux,sockets,C,Linux,Sockets,所以,我用一些CopyIta设置了原始套接字,它发送数据,这部分工作正常。但是如何设置通过套接字发送的数据?我正在寻找一个DNS请求,如果这有帮助的话。代码如下 int main(int argc, char *argv[]) { if (!argv[1]) { printf("Target not specified!\nUsage: "); printf(argv[0]); printf(" <target>\n")

所以,我用一些CopyIta设置了原始套接字,它发送数据,这部分工作正常。但是如何设置通过套接字发送的数据?我正在寻找一个DNS请求,如果这有帮助的话。代码如下

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);
    }
}
intmain(intargc,char*argv[])
{
如果(!argv[1])
{
printf(“未指定目标!\n用法:);
printf(argv[0]);
printf(“\n”);
出口(1);
}
结构ip;
结构udphdr udp;
国际标准差;
const int on=1;
sin中的结构sockaddr_;
//char msg[]=“\x03\xF0\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01”;
u_char*数据包;
数据包=(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_和=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((无符号短*)&ip,sizeof(ip));
memcpy(数据包、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,(无符号短*)&udp,sizeof(udp));
memcpy(数据包+20,&udp,sizeof(udp));
如果((sd=插槽(AF_INET、SOCK_RAW、IPPROTO_RAW))<0){
perror(“原始插座”);
出口(1);
}
如果(设置锁定选项(sd、IPPROTO_IP、IP_HDRINCL和on、sizeof(on))<0){
perror(“setsockopt”);
出口(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”);
出口(1);
}
}

嗯……我想你想知道如何在邮件中设置有效负载?基本上,您希望从IP和UDP头开始偏移,并在该点开始写入有效负载数据

这是一个匆忙拼凑的例子:

int offset = packet + sizeof(struct ip) + sizeof(struct udphdr);
然后,您可以按如下方式写入有效负载:

strcpy(offset, "1234");
以下是一些有效地通过原始IP套接字写入数据的ICMP代码:

struct icmphdr *icmp_hdr; 
char *datapart; 

icmp_hdr = (struct icmphdr *) icmp_data; 
icmp_hdr->i_type = ICMP_ECHO; 
icmp_hdr->i_code = 0; 
icmp_hdr->i_id = (unsigned short) getpid();
icmp_hdr->i_cksum = 0; 
icmp_hdr->i_seq = 0; 
datapart = icmp_data + sizeof(struct icmphdr); 
memset(datapart, 'E', datasize - sizeof(struct icmphdr));  

嗯…我想你想知道如何在你的信息中设置有效载荷?基本上,您希望从IP和UDP头开始偏移,并在该点开始写入有效负载数据

这是一个匆忙拼凑的例子:

int offset = packet + sizeof(struct ip) + sizeof(struct udphdr);
然后,您可以按如下方式写入有效负载:

strcpy(offset, "1234");
以下是一些有效地通过原始IP套接字写入数据的ICMP代码:

struct icmphdr *icmp_hdr; 
char *datapart; 

icmp_hdr = (struct icmphdr *) icmp_data; 
icmp_hdr->i_type = ICMP_ECHO; 
icmp_hdr->i_code = 0; 
icmp_hdr->i_id = (unsigned short) getpid();
icmp_hdr->i_cksum = 0; 
icmp_hdr->i_seq = 0; 
datapart = icmp_data + sizeof(struct icmphdr); 
memset(datapart, 'E', datasize - sizeof(struct icmphdr));  

sendto
的最后一个参数不应该是
sizeof(struct sockaddr\u in)
?虽然这可能是真的,但它与我的问题并不相关,而且它的工作方式也很好,我只是想知道如何设置消息。为什么使用原始套接字而不是UDP套接字?我不清楚你在问什么。。。你说发送的部分正在工作,那么“设置消息”是什么意思呢?
sendto
的最后一个参数不应该是
sizeof(struct sockaddr_in)
?虽然这可能是真的,但它与我的问题并没有真正的关系,而且按照我的方式工作得很好,我只是想知道如何设置消息。为什么使用原始套接字而不是UDP套接字?我不清楚你在问什么。。。你说发送的部分是有效的,那么“设置消息”是什么意思?是的,这就是我要找的。谢谢是的,这就是我要找的。谢谢