![]() |
Winsock Fehler ("ungültige" IP Adresse)
Hi,
Der folgende Code soll ein RAW Socket erzeugen. Allerdings erhalte ich immer den Fehler: "Die angeforderte Adresse ist in diesem Kontext ungültig." Die Variable "User" ist eine (100% gültige) externe IP Adresse. "Port" ist die Nummer irgendeines Ports im gültigen Bereich. Die exists bei den Socketfehlern fehlen absichtlich.
Delphi-Quellcode:
Mit lokalen IP Adressen funktioniert es, aber nicht mit externen :-(
procedure TForm1.CreatePort(User: String);
var Port,i, AddrLength: Integer; aSocket: TSocket; sa: TSockAddrIn; recvto: Integer; dwBufferInLen, dwBytesReturned: DWord; dwBufferLen: Array[0..9] of DWord; begin try aSocket := socket(AF_INET, SOCK_RAW, IPPROTO_IP); if aSocket = INVALID_SOCKET then begin Form1.Statusbar1.simpleText:='Create: ' + SysErrorMessage (WSAGetLastError); end; recvto := 5000; if setsockopt(aSocket, SOL_SOCKET, SO_RCVTIMEO, @Char(recvto), Sizeof(recvto)) = SOCKET_ERROR then begin Form1.Statusbar1.simpleText := 'Setopt: ' + SysErrorMessage(WSAGetLastError); end; ZeroMemory(@sa,Sizeof(sa)); sa.sin_family := AF_INET; sa.sin_port := htons(Port); sa.sin_addr.s_addr := inet_addr(Pchar(trim(User))); if bind(aSocket, @sa, Sizeof(sa)) = SOCKET_ERROR then begin Form1.Statusbar1.simpleText := 'Bind: ' + SysErrorMessage(WSAGetLastError); end; If connect(aSocket, @sa, SizeOf(sa))=SOCKET_ERROR then begin Showmessage('Connect: ' + SysErrorMessage(WSAGetLastError)); exit; end; finally CloseSocket(aSocket); end; end; Weiss jemand was ich hier falsch mache/nicht verstanden habe? Gruß, Dani |
Re: Winsock Fehler ("ungültige" IP Adresse)
Ganz easy: Mit bind() weißt du einem Socket eine lokale Adresse zu.
Eine lokale eben, keine externe. BTW: Kann es sein, dass der Code die Übersetzung von C nach Delphi des Programmms, das es hier gibt, ist: ![]() Falls ja, sag Bescheid, dann schick ich dir mal was, ich hab das ganze auch mal gemacht, aber aus den in ![]() |
Re: Winsock Fehler ("ungültige" IP Adresse)
Achso *ups*
Und wie weise ich dem Socket eine externe Adresse zu? ;) Den Code habe ich teilweise aus deinem Programm entnommen und editiert, funktioniert super =) |
Re: Winsock Fehler ("ungültige" IP Adresse)
Ach so, aus meinem. Hah mich schon gewundert, dass du teilweise die gleichen Variablennamen benutzt hast :wink:
bind() brauchst du nur für Sockets im Listen-Mode, also für Server. Du kannst einem Socket keine externe Adresse zuweisen. Was willst du denn überhaupt machen, vielleicht kann ich dir dann mehr helfen. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Danke für die Hilfe Chewie!!
Ich glaub ich versteh jetzt wie ich es einstellen muss... |
Re: Winsock Fehler ("ungültige" IP Adresse)
Ich weiß nicht genau, welche Header bei RawSockets schon dabei sind und welche man noch hinzufügen muss.
Die Header der ersten beiden Schichten (MAC-Adresse etc.) sind sicher schon dabei, aber ob du den IP-Header auch selbst mitschicken musst, weiß ich nicht. Den TCP/UDP-Header musst du aber bestimmt selber basteln. Ein Datenverkehr ist immer zwischen zwei Sockets aufgebaut; ein Socket ist die Kombination aus IP-Adresse und Port. Um dich in den Datenverkehr einzuklinken, musst du praktisch ein IP-Paket mit den Adressen und Ports der jeweiligen Verbindungspartner. Evtl. muss auch noch das Paket des Transportprotokolls entsprechend verändert (nur bei TCP: Acknowledgementnumer etc.). Die Sache ist aber die: Wenn der Remote-Rechner das Paket nicht annehmen will, dann tut er das auch nicht. Eine Verbindung geht über ein Two-Way- oder Three-Way-Handshake, das ist der Autausch von TCP-Paketen mit gegenseitig abgestinnten Ack-Nummern. Wie gesagt, wenn der Remote-Rechner die Verbindung nicht annehmen will, dann tut er es auch nicht. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Oh, das ist schlecht, denn von sowas hab ich zu wenig Ahnung :?
Dann lass ich es wohl =( aber trotzdem vielen Dank für die Hilfe! |
Re: Winsock Fehler ("ungültige" IP Adresse)
Heißt es nicht auch, daß nur ein Admin RAW-Socks erstellen darf?
Könnte es daran liegen (das ist, was mir bei 'Kontext' einfällt), |
Re: Winsock Fehler ("ungültige" IP Adresse)
Nein, "Kontext" heißt in diesem Fall, dass eine externe Adresse keinem lokalen Socket zugewiesen werden kann.
Es heißt ja auch bei bind(): Zitat:
Der "normale" Benutzer mit Admin-Rechten unter 2K und XP kann auf jeden Fall RawSockets erstellen. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Was ist denn ein "normaler Benutzer mit Adminrechten".
Frage, kann er sie auch benutzen? Ich weiß, da gibt es irgendeine Einschränkung ... aber welche??!! |
Re: Winsock Fehler ("ungültige" IP Adresse)
Zitat:
Was genau der alles kann, weiß ich nicht. Bei 2K, das ich gerade draufhabe, ist mein normaler Benutzer Mitglied der Gruppe Administratoren, der kann das auch. Zitat:
|
Re: Winsock Fehler ("ungültige" IP Adresse)
Jupp, das zählt ja als Admin (eben alle die der Gruppe angehören). Unter W2K ist bei einer Normalo-Installation aber der "Hauptbenutzer" kein Admin -> daher könnte meine Aussage vielleicht marginalen Wert für den Frager haben *g*
|
Re: Winsock Fehler ("ungültige" IP Adresse)
Zitat:
Ich bin einer, und ich glaub nicht, dass ich nach der Installation in der Hinsicht was verändert habe :? |
Re: Winsock Fehler ("ungültige" IP Adresse)
Also, wenn du dich anmelden mußt (und das so eingestellt hast während des Setups) dann bist du wahrscheinlich wirklich Admin. Default ist aber, daß sich der User nicht anmelden muß ... dann ist er (wenn dies während der Installation nicht verändert wurde) Hauptbenutzer (aber nicht Admin).
|
Re: Winsock Fehler ("ungültige" IP Adresse)
Da ich der einzige Benutzer bin, hab ich bei der Installation eingestellt, dass er mich automatisch anmelden soll. Trotzdem bin ich in der Admin-Gruppe.
Aber was solls, das ist nicht das Thema hier. Ich hab auch mal irgendwo was gelesen, dass mit RawSockets und Adminrechten zu tun hatte, aber ich weiß nicht mehr, in welchem Zusammenhang, und schon gar nicht mehr, wo. |
Re: Winsock Fehler ("ungültige" IP Adresse)
So, hab mich jetzt mal als Gast angemeldet und versucht, einen RawSocket zu erstellen.
Ergebnis: Fehler WSAEACCES. Witzigerweise steht dieser Fehler gar nicht in der Tabelle der möglichen Fehler bei socket(). |
Re: Winsock Fehler ("ungültige" IP Adresse)
Moin Chewie,
da hätte Dir das PSDK weiterhelfen können. Hier ist der Fehler in der Windows Socket Reference beschrieben. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Das ist klar. Ich will gar nicht wissen, wie viel Seiten ich schon darin über Windows Sockets gelesen hab :wink:
Ich meinte, dass bei der Beschreibung der Funktion socket im Abschnitt Return Values nicht die Möglichkeit erwähnt ist, dass WSAWACCES zurrückgegeben wird. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Moin Chewie,
ach so... Ich lass mir immer, zumindest beim Testen, die API Fehler immer mit einem ShowMessage(SysErrorMessage(...)) anzeigen. Mir wär das also gar nicht so aufgefallen ;-) Das ist mit Sicherheit nicht die einzige API Funktion bei der die Möglichen Fehlercodes unvollständig sind. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Zitat:
Ich hab jetzt übrigens was über die Benutzerrechte gefunden: Zitat:
|
Re: Winsock Fehler ("ungültige" IP Adresse)
Ich hab dann doch noch eine Verständnisfrage :mrgreen:
Warum muss ich mit einer Socket zwangsläufig connecten bevor ich etwas senden kann? Es macht natürlich Sinn wenn man eine ordentliche Verbindung herstellen will, aber gibt es keinen Weg, das TCP/IP Protokoll etwas "unhöflicher" zu betreiben (Auch auf die Gefahr hin, dass das gesendete Packet schlicht aussortiert wird) ? Gibt es eine Möglichkeit, ein beliebiges Packet an eine IP Adresse zu schicken, ohne connect, ohne Handshake? |
Re: Winsock Fehler ("ungültige" IP Adresse)
Bei TCP nicht! Das ist deshalb so, weil es ein Streaming-Protokoll ist und nicht ein Datagram-Protokoll wie zB UDP.
Es wird also immer eine Verbindung benötigt, da es einen Handshake zwischen den beiden Partnern gibt. Man kann zwar IP-Pakete wild umher schicken (oder direkt an eine Broadcast-Adresse schicken) aber das wird nicht viel bringen, da alle verbindungsorientierten Protokolle das höchstens als Anfang einer Verbindung ansehen werden. ZB wenn du ein SYN-Paket schickst ... dann "denkt" der Server, du willst mit ihm verbinden und reserviert schonmal Ressourcen. Daher werden SYN-Floods auch für (D)DoS-Attacken benutzt. |
Re: Winsock Fehler ("ungültige" IP Adresse)
Könnte man in diesem Fall nicht ausnutzen, dass eigentlich schon eine Verbindung zwischen den beiden Computern besteht?
z.B. Comp A hat auf Port 4000 einen Server laufen Comp B verbindet sich mit Comp A und horcht auf Port 1780 auf Anweisungen, die vom Server kommen. Comp A schickt versch. Daten an Comp B.... ---- Auf Comp A wird nun ein Programm gestartet, das ein einzelnes Packet zu Comp B auf Port 1780 schickt. (In diesem Fall ein Packet, das Comp B sagt, dass der Server nicht mehr existiert). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz