raw sockets
-
also mein problem is folgendes: ich will nen raw socket und meinen ip und protokoll header selbst erstellen. Also hab ich mir das Tutorial über raw sockets auf c-worker.ch mal angeschaut aber ich bekomm es irgendwie nicht hin dass meine beiden header übertragen werden.
Bei dem Tut macht er das ja mitmemcpy(szPacket, &hdrICMPHeader, sizeof(icmp_header_t)); memcpy(szPacket + sizeof(icmp_header_t), szData, usDataLen);
aber da wird nur der icmp header reinkopiert ich will aber das auch der von mir selbst erstellte ip header da rein kommt also hab ichs so gemacht
[code type"C++" tabs="4"]
memcpy(Packet, &iphdr, sizeof(ip_header_s));
memcpy(Packet + sizeof(udp_header_s), &udphdr, sizeof(udp_header_s));
memcpy(Packet + sizeof(ip_header_s)+ sizeof(udp_header_s), szSTRING, sizeof(ip_header_s) + sizeof(udp_header_s) + sizeof(szSTRING));
[/cpp]aber wenn ich jetzt mit nem sniffer schau was geschickt wird, dann wird immer nur ein vom system erstellter ip header und meine daten verschickt...
-
das soll natürlich heißen
memcpy(Packet, &iphdr, sizeof(ip_header_s)); memcpy(Packet + sizeof(udp_header_s), &udphdr, sizeof(udp_header_s)); memcpy(Packet + sizeof(ip_header_s)+ sizeof(udp_header_s), szSTRING, sizeof(ip_header_s) + sizeof(udp_header_s) + sizeof(szSTRING));
und OS is winXp prof. wenn das was zur sache tut.
-
So hier mal der ganze code. Es sollen nur daten gesendet werden und nicht empfangen.
#include <stdio.h> #include "main.h" #define szSTRING "TesTesTesTesTesTesT\0" struct ip_header_s { unsigned char ip_hl:4, ip_v:4; unsigned char ip_tos; unsigned short int ip_len; unsigned short int ip_id; unsigned short int ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short int ip_sum; unsigned int ip_src; unsigned int ip_dst; }; struct udp_header_s { unsigned short int uh_sport; unsigned short int uh_dport; unsigned short int uh_len; unsigned short int uh_check; }; int main() { char Packet[1024]; SOCKET s; ip_header_s *iphdr = (struct ip_header_s *)Packet; udp_header_s *udphdr = (struct udp_header_s *)Packet + sizeof(struct ip_header_s); strcat(Packet, szSTRING ); sockaddr_in sockaddr; WinsockStartup(); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(7777); sockaddr.sin_addr.s_addr = inet_addr("80.128.134.124"); s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if(s == INVALID_SOCKET) { printf("Invalid Socket\n"); return 0; } memset(Packet, 0, sizeof(Packet)); iphdr->ip_hl = 5; iphdr->ip_v = 4; iphdr->ip_tos = 0x8; iphdr->ip_len = sizeof(struct ip_header_s) + sizeof(struct udp_header_s) + sizeof(szSTRING); iphdr->ip_id = 156; iphdr->ip_off = 0; iphdr->ip_ttl = 128; iphdr->ip_p = IPPROTO_RAW; iphdr->ip_sum = 0; iphdr->ip_src = inet_addr("80.128.134.124"); iphdr->ip_dst = inet_addr("80.128.134.124"); udphdr->uh_check = 0; udphdr->uh_len = htons(sizeof(struct udp_header_s) + sizeof(szSTRING)); udphdr->uh_sport = htons(7777); udphdr->uh_dport = htons(7777); udphdr->uh_check = Checksum((unsigned short *)Packet, iphdr->ip_len ); iphdr->ip_sum = Checksum((unsigned short *)Packet, iphdr->ip_len ); memcpy(Packet, &iphdr, sizeof(ip_header_s)); memcpy(Packet + sizeof(udp_header_s), &udphdr, sizeof(udp_header_s)); memcpy(Packet + sizeof(ip_header_s)+ sizeof(udp_header_s), szSTRING, sizeof(ip_header_s) + sizeof(udp_header_s) + sizeof(szSTRING)); sendto(s, Packet, sizeof(Packet), 0 , (struct sockaddr *) &sockaddr, sizeof (sockaddr)); return 0; }