AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TSocks bind() Typen von Records stimmen nicht überein
Thema durchsuchen
Ansicht
Themen-Optionen

TSocks bind() Typen von Records stimmen nicht überein

Ein Thema von SyntaxXx · begonnen am 9. Mai 2015 · letzter Beitrag vom 11. Mai 2015
Antwort Antwort
Seite 1 von 2  1 2      
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

TSocks bind() Typen von Records stimmen nicht überein

  Alt 9. Mai 2015, 14:38
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".

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:
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 9. Mai 2015, 20:52
Zitat:
Dann möchte ich das Socket binden:
SocketError := bind(ListenSocket, SocketAddress, SizeOf(SockAddr_in));
Und genau an dieser Stelle kommt der Fehler.
"SocketAddress" wird markiert.
Guten Abend,

so sollte es gehen:

Delphi-Quellcode:
SockAddrSize := sizeOf(SockAddr_in)
SocketError := bind(ListenSocket, SocketAddress, SocketAddrSize));
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#3

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 9. Mai 2015, 21:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 9. Mai 2015, 23:31
Zitat:
Aus der WinApi benutze ich das Record "SockAddr_in".
Was soll WinApi für eine Unit sein?

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?
$2B or not $2B
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 10. Mai 2015, 09:59
Zitat:
Delphi-Quellcode:
        SocketAddress.sin_family := AF_INET;
        SocketAddress.sin_port := htons(9000);
        SocketAddress.sin_addr.S_addr := inet_addr(PAnsiChar('127.0.0.1'));
in C auf Linux schaut das so aus:

Code:
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)
Die Funktion bind() benötigt 3 Parameter.
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 Tutorial kennnst Du schon?

Grüße
Klaus
Klaus

Geändert von Klaus01 (10. Mai 2015 um 10:06 Uhr)
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#6

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 10. Mai 2015, 16:50
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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 11. Mai 2015, 08:00
Und ich dachte:"Komm ich nehme winsock2, da das eine neurere Version der Unit ist".
http://stackoverflow.com/questions/1...h-which-to-use

Zitat:
"winsock.h should only be used if you target old version of Windows like Windows 95 / Windows NT 3.5."
-> Winsock(.h) sollte nur verwendet werden wenn die Anwendung auf alten Versionen von Windows eingesetzt werden soll. Für neue Projekte sollte winsock2 verwendet werden.
Michael Justin
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#8

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 11. Mai 2015, 08:22
Ä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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 11. Mai 2015, 09:00
sockaddr verwenden?
$2B or not $2B
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#10

AW: TSocks bind() Typen von Records stimmen nicht überein

  Alt 11. Mai 2015, 09:09
Grundsätzlich keine schlechte Idee xD

Aber hier mal der Aufbau beider Strukturen:
Code:
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];
};
Bei sockaddr fehlen mir jetzt leider "sin_port" und "sin_addr".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz