![]() |
TSocks bind() Typen von Records stimmen nicht überein
Ich arbeite mich gerade in die Socketerstellung ein und stoße jetzt auf ein Problem.
Ich bekomme die Meldung: Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen Nur verstehe ich diese Meldung nicht, bzw. verstehe nicht, warum diese kommt. Aus der WinApi benutze ich das Record "SockAddr_in".
Delphi-Quellcode:
SocketAddress: SockAddr_in;
Dann fülle ich die Felder:
Delphi-Quellcode:
SocketAddress.sin_family := AF_INET;
SocketAddress.sin_port := htons(9000); SocketAddress.sin_addr.S_addr := inet_addr(PAnsiChar('127.0.0.1')); Dann möchte ich das Socket binden:
Delphi-Quellcode:
SocketError := bind(ListenSocket, SocketAddress, SizeOf(SockAddr_in));
Und genau an dieser Stelle kommt der Fehler. "SocketAddress" wird markiert. Warum kommt der Fehler und wie kann ich diesen Beheben? |
AW: TSocks bind() Typen von Records stimmen nicht überein
Zitat:
so sollte es gehen:
Delphi-Quellcode:
Grüße
SockAddrSize := sizeOf(SockAddr_in)
SocketError := bind(ListenSocket, SocketAddress, SocketAddrSize)); Klaus |
AW: TSocks bind() Typen von Records stimmen nicht überein
Hat leider auch nichts gebracht.
Hier mal der ganze Code, damit kann man bestimmt besser was mit anfangen :)
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Winsock2, Windows; var Data: WSAData; SocketError: Integer; ListenSocket: TSocket; ClientSocket: TSocket; SocketAddress: SockAddr_in; SocketAddressSize: Integer; MessageBytes: Integer; recvbuf: Array[0..511] of Char; begin try { TODO -oUser -cConsole Main : Code hier einfügen } SocketError := WSAStartup(MAKEWORD(2,2), Data); if SocketError = 0 then begin ListenSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if NOT ListenSocket = INVALID_SOCKET then begin SocketAddress.sin_family := AF_INET; SocketAddress.sin_port := htons(9000); SocketAddress.sin_addr.S_addr := inet_addr(PAnsiChar('127.0.0.1')); SocketAddressSize := SizeOf(SockAddr_in); SocketError := bind(ListenSocket, SocketAddress, SocketAddressSize); // Hier der Fehler, auch nach der Änderung if SocketError = 0 then begin SocketError := listen(ListenSocket, SOMAXCONN); if SocketError = 0 then begin ClientSocket := accept(ListenSocket, Nil, Nil); if ClientSocket = TSocket then begin repeat MessageBytes := recv(ClientSocket, recvbuf, SizeOf(recvbuf), 0); Writeln(MessageBytes); until MessageBytes = 0 ; end; end; end; end; end; closesocket(ClientSocket); closesocket(ListenSocket); WSACleanup; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: TSocks bind() Typen von Records stimmen nicht überein
Zitat:
Wie wäre es, wenn du schaust, wo der Typ "SockAddr_in" deklariert ist, dann schaust du wie "Bind" deklariert ist und von wo der Typ des Parameters kommt und ob das wirklich der selbe Typ ist? |
AW: TSocks bind() Typen von Records stimmen nicht überein
Zitat:
Code:
Die Funktion bind() benötigt 3 Parameter.
listenSocket = socket(AF_INET, SOCK_STREAM,0);
socketAddress.sin_family = AF_INET inet_pton(AF_INET,server_ip,&socketAddress.sin_addr.s_addr); socketAddress.sin_port = htons(portNumber) socketAddressSize = sizeOf(socketAddress) Das Tutorial kennst Du schon? bind(listenSocket, (stuct sockAddr_in*)&socketAddress, socketAddressSize) Es beginnt mit der Identifiaktionsnummer (listenSocket) des Sockets, der "gebunden"werde soll. Diese Nummer hatte zuvor aufgerufene socket()-Funktion erzeugt. Dann kommt der Zeiger auf die Datenstruktur in der die Adressinformation gespeichert ist (socketAddress) und schließlich die Länge dieser Datenstruktur) (Quelle: Martin Pollakowski, Grundkurs Socketprogrammierung mit C unter Linux) Ähnlich sollte es auch mit Winsock funktionieren. Das ![]() Grüße Klaus |
AW: TSocks bind() Typen von Records stimmen nicht überein
Während ich gerade den Fehler weiter am beschreiben war, habe ich die Lösung gefunden.
Ich hatte die Unit "winsock2" eingebunden. Die war sehr identisch mit der Unit "winsock", nur dass hier die bind-Methode das Record "sockaddr" benötigt und nicht "sockaddr_in". Also habe ich die Unit "winsock" benutzt und schon gehts. Und ich dachte:"Komm ich nehme winsock2, da das eine neurere Version der Unit ist". Naja, falsch gedacht :) Ich danke für eure Hilfe. |
AW: TSocks bind() Typen von Records stimmen nicht überein
Zitat:
![]() Zitat:
|
AW: TSocks bind() Typen von Records stimmen nicht überein
Ähm ok, wenn ich aber jetzt winsock2 benutze, stehe ich vor dem Problem, dass die bind-Methode ein sockaddr-Record verlangt und kein sockaddr_in-Record.
Was also tun? |
AW: TSocks bind() Typen von Records stimmen nicht überein
sockaddr verwenden? :stupid:
|
AW: TSocks bind() Typen von Records stimmen nicht überein
Grundsätzlich keine schlechte Idee xD
Aber hier mal der Aufbau beider Strukturen:
Code:
Bei sockaddr fehlen mir jetzt leider "sin_port" und "sin_addr".
struct sockaddr {
ushort sa_family; char sa_data[14]; }; struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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 by Thomas Breitkreuz