2015-01-14 2 views
1

Моя функция в настоящее время работает правильно, однако она отправляет с моего основного IP-адреса серверов вместо другого.Изменить исходный IP-адрес в сокете sendto()

Вот фрагмент кода:

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; 
} 

Это посылает пакет в переменную ш, на порт 1900 с моего сервера по умолчанию IP позволяет называть его 192.168.0.1, однако я хочу, чтобы отправить пакет из 192.168.1.1, чтобы подделать UDP-пакет для подмены другого адреса.

servaddr.sin_addr.s_addr=htonl(w); 

Обрабатывает адрес назначения, но я пытаюсь отредактировать исходный IP-адрес.

+1

Я думаю, для этого вам нужны сырые сокеты. – edmz

+0

ПРИМЕЧАНИЕ: 'bytes_sent + = sizeofpayload;' wrong; для этого вы должны отправить возвращаемое значение sento(). – wildplasser

+0

Вам нужна правильная обработка ошибок. Например, если 'sendto()' возвращает -1, вы не отправили никаких байтов вообще. – EJP

ответ

7

Если 192.168.1.1 является локальным IP-адресом отправляющего ПК, вы можете bind() сокет до 192.168.1.1 до звонка sendto(). В противном случае вы должны использовать сокет SOCK_RAW (который предназначен только для пользователей-администраторов) и создавать заголовки IP и UDP вручную.

Смежные вопросы