更改套接字sendto()中的源IP

时间:2015-01-14 18:48:17

标签: c sockets sendto

我的功能目前正常运行,但是它从我的服务器发送主IP地址而不是另一个。

以下是代码片段:

void *sendpacket(void *par1)
{
        running_threads++;
        int thread_id = (int)par1;
        unsigned long start_ip = htonl(ntohl(start)+(per_thread*thread_id));
        unsigned long end = htonl(ntohl(start)+(per_thread*(thread_id+1)));
        unsigned long w;
        int y;
        unsigned char buf[65536];
        strcpy(buf, "M-SEARCH * HTTP/1.1\r\nHost:239.255.255.250:1900\r\nST:ssdp:all\r\nMan:\"ssdp:discover\"\r\nMX:3\r\n\r\n");
        int sizeofpayload = 90;
        int sock;
        if((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0) {
                perror("cant open socket");
                exit(-1);
        }
        for(w=ntohl(start_ip);w<htonl(end);w++)
        {
                struct sockaddr_in servaddr;
                bzero(&servaddr, sizeof(servaddr));
                servaddr.sin_family = AF_INET;
                servaddr.sin_addr.s_addr=htonl(w);
                servaddr.sin_port=htons(1900);
                sendto(sock,(char *)buf,sizeofpayload,0, (struct sockaddr *)&servaddr,sizeof(servaddr));
                bytes_sent+=sizeofpayload;
                scanned++;
                hosts_done++;
                usleep(sleep_between*1000);
        }
        close(sock);
        running_threads--;
        return;
}

这会将数据包发送到变量w,在端口1900上从我的默认服务器IP中调用它192.168.0.1但是我希望它从192.168.1.1发送数据包,因此伪造UDP数据包欺骗到另一个地址。 / p>

servaddr.sin_addr.s_addr=htonl(w);

处理目标地址,但我很难编辑源IP地址。

1 个答案:

答案 0 :(得分:7)

如果192.168.1.1是发送PC的本地IP,则可以在调用bind()之前sendto()套接字为192.168.1.1。否则,您必须使用SOCK_RAW套接字(仅限管理员用户)并手动创建IP和UDP标头。