manuel TCP handshake

Tags:    c++

hej - jeg skal lave et program der benytter TCP, men jeg må ha manuel kontrol over handshaking. går ud fra jeg derfor skal bruge RAWSOCK og smide nogle hjemmebagte header structs med sendto()..

efter hva jeg kan se blir socket() tredje parameter sat direkte i ipheaderns protokol feldt.

sockfd = socket(AF_INET, SOCK_RAW, 6);

problemet er der sker en konflikt under bind(); error 10022 invalid argument ?? noen der har løsning på dette??

min bind() ser således ud (my_addr er hentet via WSAIoctl socket list):

if((bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr))) == SOCKET_ERROR) {
printf("Could not bind socket!\\n");
printf("error: %d", WSAGetLastError());
exit(8);
}







4 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Jeg kan ikke se nogen fejl i det du har postet. Dette lille program kompilerer fint (men virker naturligvis ikke):

Fold kodeboks ind/udKode 




ok gravede lidt videre med det, og det ser ud til at windows kernen delvis blokere adgang til netværkslaget.
men jeg fandt noget der hedder winPcap der giver kontrol på ethernet frame niveau :-)
forstår bare stadig ikke helt hvorfor bind() fejler med kode 10022
(Invalid argument) dette sker kun når man sætter protokollen = 6 (IPPROTO_TCP) - man kan bind() hvilkesomhelst anden socket med protokol mellem 0-255 (IPPROTO_IP - IPPROTO_RAW henholdsvis) untaget TCP.. og jeg må jo ha 6 i ipheaderen proto felt for at der skal ske noget tcp relateret.

WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);

SOCKET sockfd;
sockfd = Socket(AF_INET, SOCK_RAW, IPPROTO_TCP);

bind(sockfd, (struct sockaddr*)&my_addr, sizeof(sockaddr))



Undskyld, jeg troede du havde en kompile fejl, ikke en run-time fejl.

Hvordan initialiserer du my_addr?
Er du sikker på at det giver mening at lave en raw socket med IP-protokol sat til at være TCP?



mht my_addr har jeg prøvet begge del:

struct sockaddr_in my_addr;
memset(&dest_addr, '\\0', sizeof(sockaddr_in));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(80);
my_addr.sin_addr.s_addr = INADDR_ANY;

INADDR_ANY gir vist bare 0.0.0.0 men fungere fint.
prøvet også den omstændige med:

WSAIoctl( sockfd, SIO_ADDRESS_LIST_QUERY,
NULL, 0, &sl_buffer, sizeof( sl_buffer ),
&n, NULL, NULL ) == SOCKET_ERROR ) ... osv.

den henter min korekte lokale ip. - ingen af delene hjælper..

men jeg tror da det gir mening at definere:

socket(AF_INET, SOCK_RAW, 6);

kan ihvertfald se med netværks analyser, at den 3. parameter går direkte i ipheaderens protokol feldt.. bar ikke med 6 (TCP).
socket() melder ikke nogen fejl.. først ved bind()

det funker fint andre protokoller fx icmp:

// icmp header - indehold er gas untaget første byte
char buffer[] = {
0x08, // echo request
0x00, // code
0x00, 0x00, // chksum
0x00, 0x00, 0x00, 0x00, // id
0x00, 0x00, // sequence
0x00, 0x00, 0x00, 0x00, // timestamp

0x00, 0x01, 0x02, 0x03, // padding
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b,
0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17,
0x18, 0x19,
};

s=socket(AF_INET, SOCK_RAW, 1);
bind(s, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
sendto(s,
buffer,
strlen(buffer),
0,
(struct sockaddr*)&dest_addr,
sizeof(struct sockaddr));








t