Проблема в следующем: udp пакет отправляется но src и dst порты 0ли, длина пакета тоже 0:
22:56:30.648514 IP 192.168.1.12.0 > 192.168.1.1.0: truncated-udplength 0
вот сам код:
#include <netinet/udp.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <stdio.h>
//#define __USE_BSD
//#define __FAVOR_BSD
unsigned short /* this function generates header checksums */
csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
int main() {
struct ip *myip;
struct udphdr *myudp;
struct sockaddr_in sin;
char payload[4096];
myip=(struct ip *)payload;
myudp=(struct udphdr *)payload+sizeof(struct ip);
sin.sin_family=AF_INET;
sin.sin_port = htons(22);
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
memset(payload, 0, 4096);
myip->ip_hl=5;
myip->ip_v=4;
myip->ip_tos=0;
myip->ip_len=sizeof(struct ip)+sizeof(struct udphdr);
myip->ip_id=htonl(6666);
myip->ip_off=0;
myip->ip_ttl=255;
myip->ip_p=17;
myip->ip_sum=0;
myip->ip_src.s_addr=inet_addr("192.168.1.12");
myip->ip_dst.s_addr=sin.sin_addr.s_addr;;
myudp->uh_sport=htons(47777);
myudp->uh_dport=htons(22);
myudp->uh_ulen=htons(sizeof(struct udphdr)+sizeof(payload));
myudp->uh_sum=0;
myip->ip_sum = csum((unsigned short *)payload, myip->ip_len >> 1);
int s = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
int one = 1;
const int *val = &one;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one));
sendto(s,payload,myip->ip_len,0,(struct sockaddr *)&sin, sizeof(sin));
}

Ответ на:
комментарий
от mky
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Сокеты. (2004)
- Форум трассировка icmp (2016)
- Форум Почему не читаются пакеты из raw socket? (2023)
- Форум Таймаут для connect() (2009)
- Форум BROADCAST sendto вызывает Permission denied (2004)
- Форум Не понимаю почему не работает (2013)
- Форум socket error (2009)
- Форум Долго отрабатывает программа (2018)
- Форум Подсчет числа возможных открытых TCP-портов (2011)
- Форум Сокеты передача сообщений между компьютерами. Помогите найти ошибку. (2012)