Autor Beitrag
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Di 05.04.05 16:23 
Hi Leute,

kennt jemand von euch eine Möglichkeit, ein IP-Paket selbst zu "konstruieren", dieses dann zu verschicken und die Antwort ebenso wieder auswerten?

Gruß, Moritz
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 05.04.05 16:32 
Nein, du kannst den IP- Header in seinem Aufbau nicht so verändern, dass er noch für andere lesbar ist.
D.h. das IP- Paket würde nie ankommen.
Mußt dich eben an Definition halten.

en.wikipedia.org/wiki/IPv4

Allderdings, kannst du die Werte nach belieben modifizeren.

//Edit: oder meinst du den definierten Aufbau, nach IEEE, selbst vorzunehmen?

Wenn ja, kannst du das gerne machen.. "wie" bleibt dir ja überlassen, mußen ja nur die
Bytes übereinstimmen und die Werte korrekt sein.

Schicken kannst du das dann *überleg* ich glaube nur per RAW- Socket.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Di 05.04.05 16:37 
Hallo,

ja, ich wollte es nach der ich RFC definierten Struktur aufbauen, das ist dann ja nicht's weiter als ein Record. Ich weiß nur nicht, mit welcher Funktion ich es versenden bzw. das komplette Antwortpaket empfangen kann.
Ich muss auf Felder aus dem Feld zugreifen.

Gruß
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 05.04.05 16:48 
msdn.microsoft.com/l...binding_a_socket.asp

Normalerweise kannst du das über Socket problemlos machen.
Mußt den Protokolltypen nur angeben. Ob es einen Protokolltypen gibt, der
nur IP anbietet, weiß ich nicht, aber ich vermute schon.
Schau mal bei "Creating a Socket" oder "Binding a Socket".

Ansonsten wie gesagt über RAW- Sockets.

Wenn allerdings Sockets automatisch diesen Protokolltypen unterstützen, kannste sicherlich
auf die Klasse TCustomSocket oder so zugreifen.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Di 05.04.05 17:02 
Okay, Danke, ich werd mich mal ein wenig in die MSDN einlesen. Es ist halt wirklich wichtig, dass ich auf die einzelnen Felder zugrifen kann.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 05.04.05 17:06 
Kleiner Tip am Rande, die "IP Helpers" sind Gold wert.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Moritz M. Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Di 05.04.05 19:08 
Hallo,

soweit bin ich jetzt:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
var
  lwsaData: WSADATA;
  lsocket: TSOCKET;
  clientService: sockaddr_in;
  bytesSent: Integer;
  bytesRecv: Integer;
  sendbuf: Array[0..31of Char;
  recvbuf: Array[0..31of Char;
begin
  if WSAStartup(MAKEWORD(2,2), lwsaData) <> NO_ERROR then
    Exit;

  lsocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if lsocket = INVALID_SOCKET then
    Exit;

  clientService.sin_family := AF_INET;
  clientService.sin_addr.s_addr := inet_addr('128.30.52.24');  //w3c's ip-adress
  clientService.sin_port := htons(80); // port 7 to send echo's

  if connect(lsocket, TSockAddr(clientService), sizeof(clientService)) = SOCKET_ERROR then
    ShowMessage('N');



  sendbuf := 'GET / HTTP/1.1'+#13#10+'Host: w3c.org';
  bytesRecv := SOCKET_ERROR;
  bytesSent := send(lsocket, sendbuf, strlen(sendbuf), 0);
  ShowMessage(IntToStr(bytesSent) + ' bytes sent out there');

  while bytesRecv = SOCKET_ERROR do
  begin
    ShowMessage(IntToStr(bytesRecv));
    bytesRecv := recv(lSocket, recvbuf, 320);
    ShowMessage(IntToStr(bytesRecv));
    if (bytesRecv = 0or (bytesRecv = WSAECONNRESET) then
      ShowMessage('closed');
    Application.ProcessMessages;
  end;


  WSACleanup();


  ShowMessage('j');


Der Code funktionier zwar noch nicht ganz (bei recv bleibt er hängen), allerdings erhalte ich damit nicht den IP Header - Und das ist der, den ich brauche. Genauso wenig erhalte ich ihn mit Ip Helpers. Gibt es noch eine alternative Möglichkeit?
Bzw. sieht jemand den Fehler im Code? (Bitte verzeiht mir die ShowMessages, die sind zum debuggen drin. Die Implementierung ist genau nach der MSN gemacht)

Gruß