Sockets



  • Hallo,

    ich habe eine Frage zu Sockets.

    int Error;
     	WORD wVersionRequested;
    	WSADATA wsaData;
    	int err;
    	wVersionRequested = MAKEWORD( 2, 2 );
    
    	err = WSAStartup( wVersionRequested, &wsaData );
    	if ( err != 0 )
         {
        		/* Tell the user that we could not find a usable */
        		/* WinSock DLL.                                  */
        		return;
    	}
    
    	/* Confirm that the WinSock DLL supports 2.2.*/
    	/* Note that if the DLL supports versions later    */
    	/* than 2.2 in addition to 2.2, it will still return */
    	/* 2.2 in wVersion since that is the version we      */
    	/* requested.                                        */
    
    	if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
         {
        		/* Tell the user that we could not find a usable */
        		/* WinSock DLL.                                  */
        		WSACleanup( );
        		return;
    	}
      	Socket = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
      	if (Socket == INVALID_SOCKET)
      	{
        		Error = WSAGetLastError();
         	Application->MessageBoxA("Socked Error","ERROR",MB_OK);
         }
    

    Soweit bin ich da schon, bevor ich nun mit send / sendto etwas senden
    kann muss ich ja noch irgendwie den Traget Port sowie die Target IP angeben.
    Wo und wie stell ich das an?



  • sendto kann mit verbindungslosen protokollen (wie z.B. UDP, wie bei Dir) verwedendet werden.

    Das 'to' argument gibt die ip addr. und den port an.

    Hier findest Du noch mehr Infos:
    http://msdn2.microsoft.com/en-us/library/ms740148.aspx



  • Ah ja, danke Dir.

    Nun möchte ich anstatt IPPROTO_UDP einen ARP Senden, der taucht
    als protocol nicht auf.



  • Ist das nicht ICMP? Das geht über die socket API AFAIK nicht.
    Kann dir aber leider auch keinen Tip geben welche API du dafür verwenden musst.



  • Hallo,

    Nein, ARP ist nicht ICMP. Soweit ich weiss, liegt ICMP auf der gleichen Ebene wie IP, eine Ebene unter TCP im ISO/OSI-Referenzmodell. ARP liegt aber eine Ebene unter IP ist fuer die Aufloesung von IP-Adresse zu MAC-Adresse verantwortlich.
    Vielleicht hilft das hier weiter:
    http://msdn2.microsoft.com/en-us/library/aa366358.aspx



  • hustbaer schrieb:

    Ist das nicht ICMP? Das geht über die socket API AFAIK nicht.
    Kann dir aber leider auch keinen Tip geben welche API du dafür verwenden musst.

    ICMP basiert auf IP, wobei ARP sich rein auf MAC Addressen bezieht.

    Bevor in einem LAN zwei Rechner mit einander kommunizieren müssen
    die MAC Addresse bekannt sein, dann wird zunächst ein ARP request
    an alle Rechner im LAN Verbund gesendet als Daten wird dann die gewünschte
    IP mit übertragen. Da alle Rechner im LAN Verbund denn ARP request empfangen
    schaut jeder nach ob seine IP gemeint ist, fühlt sich ein Rechner angesprochen
    sendet er ein ARP Reply zurück und somit weiss der Anfragende Rechner welche
    MAC Addresse hinter dieser IP steckt.

    Hier sieht man einen ARP Request, die Destionation MAC ist FF FF FF FF FF FF
    und wird von allen Rechnern im Lan Verbund empfangen.

    Ethernet II, Src: 00:15:f2:45:54:8c, Dst: ff:ff:ff:ff:ff:ff
         Destination: ff:ff:ff:ff:ff:ff (Broadcast) // An alle
         Source: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Source or Destination Address: ff:ff:ff:ff:ff:ff (Broadcast)
         Source or Destination Address: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Type: ARP (0x0806)
    Address Resolution Protocol (request)
         Hardware type: Ethernet (0x0001)
         Protocol type: IP (0x0800)
         Hardware size: 6
         Protocol size: 4
         Opcode: request (0x0001)
         Sender MAC address: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Sender IP address: 192.168.1.121 (192.168.1.121)
         Target MAC address: 00:00:00:00:00:00 (00:00:00_00:00:00)
         Target IP address: 192.168.1.2 (192.168.1.2)
    
    0000:  FF FF FF FF FF FF 00 15 F2 45 54 8C 08 06 00 01  .........ET.....
    0010:  08 00 06 04 00 01 00 15 F2 45 54 8C C0 A8 01 79  .........ET....y
    0020:  00 00 00 00 00 00 C0 A8 01 02                    ..........
    

    Und hier die Antwort des Rechners mit der gewünschten IP.

    Ethernet II, Src: 00:11:6b:3b:66:c5, Dst: 00:15:f2:45:54:8c
         Destination: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Source: 00:11:6b:3b:66:c5 (DigitalD_3b:66:c5)
         Source or Destination Address: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Source or Destination Address: 00:11:6b:3b:66:c5 (DigitalD_3b:66:c5)
         Type: ARP (0x0806)
    Address Resolution Protocol (reply)
         Hardware type: Ethernet (0x0001)
         Protocol type: IP (0x0800)
         Hardware size: 6
         Protocol size: 4
         Opcode: reply (0x0002)
         Sender MAC address: 00:11:6b:3b:66:c5 (DigitalD_3b:66:c5)
         Sender IP address: 192.168.1.2 (192.168.1.2)
         Target MAC address: 00:15:f2:45:54:8c (00:15:f2:45:54:8c)
         Target IP address: 192.168.1.121 (192.168.1.121)
    
    0000:  00 15 F2 45 54 8C 00 11 6B 3B 66 C5 08 06 00 01  ...ET...k;f.....
    0010:  08 00 06 04 00 02 00 11 6B 3B 66 C5 C0 A8 01 02  ........k;f.....
    0020:  00 15 F2 45 54 8C C0 A8 01 79 00 00 00 0F 00 10  ...ET....y......
    0030:  06 00 00 14 A5 D0 76 31 00 00 00 00              ......v1....
    

    Hier habe ich nun die Möglichkeit an alle etwas zu senden, da ich einen µC
    mit einem eigenen IP/UDP Stack laufen habe kann ich dem so etwas mitteilen
    in dem ich z.B. den Opcode: auf 0xffff setze, der Code ist nicht gültig
    aber mein µC kennt den Code. Das wollte ich dann benutzen um den µC z.B.
    wieder auf default IP zurückzusetzen.



  • GeNeTiX schrieb:

    Hallo,

    Nein, ARP ist nicht ICMP. Soweit ich weiss, liegt ICMP auf der gleichen Ebene wie IP, eine Ebene unter TCP im ISO/OSI-Referenzmodell. ARP liegt aber eine Ebene unter IP ist fuer die Aufloesung von IP-Adresse zu MAC-Adresse verantwortlich.
    Vielleicht hilft das hier weiter:
    http://msdn2.microsoft.com/en-us/library/aa366358.aspx

    Mit der Funktion SendArp kann ich zwar einen ARP Request senden, habe aber keinen Einfluss auf die Sende Daten.

    Ich müsste so etwas mit einem RAW_SOCKET des Typs ARP machen, den gibt es aber nicht. Oder doch?



  • Oha, ok, sorry, und danke für die Info 🙂



  • Hallo,

    ich habe die Lösung, ich nehme beim RAW_SOCKET den Typ UDP
    und setze für die Target Ip xxx.xxx.xxx.255 ein, die Target Mac ist dann ebenfalls
    0xffffffffffff also ein Broadcast. Somit kann ich ein UDP Frame an alle Senden
    und die Daten im UDP Frame beinhalten weitere Infos.


Anmelden zum Antworten