einfacher Client Server test mit WinSock - nichts passiert

#1
Hio,

versuche gerade mit der freien Delphi Version "Lazarus" ein kleines Client Server Programm über Winsock zu erstellen.

ein schönes Tutorial hab ich auch gefunden, alles schön nachgebaut, compiliert ... kein Fehler :)
aber es passiert auch nix in dem Programm...ich habe einen Socket geöffnet (inkl Fehlerbehandlungsroutine), aber der Port ist z.B. auch nicht über "netstat -a" in Windows sichtbar. Und wenn ich dann über die Senderoutine was senden will kommt kein Fehler aber man sieht über Paketyzer auch kein Paket.



Hier mal der Code, hoffe das ist nicht zuviel zum posten. Könnt ihr mir einen Tipp geben wie man bei sowas überhaupt noch nach dem Fehler suchen kann oder habt ihr vllt sogar eine Idee was hier faul ist?


das hier ist erstmal die Routine die über UDP etwas raussenden soll, vllt seht ihr hier schon was falsches?
Code:
unit UDP_send;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ActnList, Windows, WinSock;

type

  { TForm2 }

  TForm2 = class(TForm)
   Label1: TLabel;
   sendbuf: TAction;
   ActionList1: TActionList;
   Button1: TButton;
   Edit1: TEdit;
   procedure Edit1KeyPress(Sender: TObject; var Key: char);
   procedure sendbufExecute(Sender: TObject);
  private
  	FSocket:TSocket;
  public
    { public declarations }
  end; 

var
  Form2: TForm2; 

implementation

procedure WS_HandleError;
var
    ErrC: Integer;
    ErrS: String;
    SLen: Integer;
begin
	ErrC := WSAGetLastError;
	SetLength(ErrS, 260);
	SLen := Formatmessage(Format_Message_from_System, nil, ErrC, 0, @ErrS[1], length(ErrS), nil);
	SetLength(ErrS, SLen);
	MessageBox(0, PChar(ErrS), 'Socket Error', MB_OK + MB_ICONERROR + MB_TASKMODAL);

end;

function createSocket_UDP: TSocket;
begin
  result := socket(AF_INET, SOCK_DGRAM, IPProto_UDP);
  if result = INVALID_SOCKET then WS_HandleError;
end;



{ TForm2 }


procedure TForm2.sendbufExecute(Sender: TObject);
var
	SockAddr : TSockAddrIn;
    AddrLen	 : Integer;
    buf      : array[0..127] of char;
    buflen   : integer;
begin
    FSocket := createSocket_UDP;

    AddrLen := SizeOf(SockAddr);
    SockAddr.sin_family := AF_INET;
    SockAddr.sin_Port := htons(6000);
    SockAddr.sin_Addr.S_Addr := inet_addr('127.0.0.1');

    buf := PChar(Edit1.Text);
    buflen := length(Edit1.Text);
    Label1.Caption:=Edit1.Text;

    if sendto(FSocket, buf, buflen, 0, SockAddr, Addrlen) = SOCKET_ERROR then WS_HandleError;

    CloseSocket(FSocket);
end;


procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: char);
begin
 	if ord(Key) = 13 then self.Button1.Click;
end;

initialization
  {$I udp_send.lrs}

finalization
	WSACleanup;
end.
button1.click ist im übrigen die Action "sendbufExecute" zugewiesen.
 
#2
Hallo,

ein Tip:

http://home.earthlink.net/~akonshin/delphi_components.htm

dort die WinSock2.2 API Version 3, ist aktueller.

was ist mit WSAStartup, schon aufgerufen?

Code:
uses SysUtils, WinSock2;

procedure WinSocketStartUp; {$IfNDef DEBUG} inline; {$EndIf}
var
  // Windows Socket API information structure
  WSAData: TWSAData;
begin
  FillChar(WSAData, SizeOf(WSAData), 0);
  // Startup windows socket api
  if WinSock2.WSAStartup($0202, WSAData) <> 0 then
    raise Exception.Create(Format('Couldn''t startup windows sockets: %s.', [WSALastErrorMessage]));
end;
BTW: Unter Windows empfiehlt sich auch WSASocket zur socket erzeugung zu nutzen.
Ebenso WSASend(To) etc. also die WSAxxxx Methoden, muss aber nicht sein, aber damit hast du
die möglichkeit super performantes socket handling z.b. IOCP zu implementieren.
 
Oben