Newsgroup: it.comp.lang.delphi
Titolo: il progetto inizia a crescere, però...problema :(

Dunque, chi mi ha seguito nell' altro post, in special modo Carlo e Davide,
sa di che parlo...=)
vi avevo lasciati che avevo un programma invisibile, che mi manda il numero
IP...grazie a incessanti martellamenti contro MSX, sono riuscito a sapere
come si utilizzano questi benedetti server e client socket...ho creato
quindi un' applicazione chiamata diabolic2 , e un' altra clientdiabolic (la
prima è scritta con le API sebbene uso dei componenti di delphi,la seconda è
visuale...)
setto come porta la 43255 in tutti e due i programmi, metto l' IP e mi
collego al server(ah faccio tutta sta prova sul Mio PC,quindi avvio sia
troi@n( ogni riferimento è puramente casuale :D) che client sulla stessa
macchina...), e tramite dei sofisticatissimi metodi di debug(showmessage :D)
riesco a scoprire che il client riesce a collegarsi al server... ora,se
scrivo qualche cavolata su di un edit, e clicco il tasto send(nell' onclick
di questo bottone ho semplicemente messo
if ClientSocket1.Socket.SendText(Edit1.text)=0 then
   showmessage('messaggio mandato');
 )
dunque, mi da errore in tutte e due i programmi,in diabolic2(il troi@n) da
l' errore 10057 (mi indica una api scrauza), e nel clientdiabolic da l'
errore "asynchronous socket error 10054"
non sono sincronizzati?boh, a me pare di aver fatto tutto come si deve...
mmm non so se postare o no il codice, se pensate che posso farlo oppure
volete vederlo nella vostra email ve lo mando...

 ha scritto nel messaggio
news:QAk17.26$eB4....@news.infostrada.it...

Non mi risponde nessuno?:(

 Non mi risponde nessuno?:(
Non avevo notato il messaggio ...
eccoti i sorgenti di una chat scritta parecchio tempo addietro in Delphi con
tanto di commenti.
---- Client ----
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Edit2: TEdit;
    Label2: TLabel;
    Memo1: TMemo;
    ClientSocket1: TClientSocket;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
{ Scelgo una porta [backdoor] su cui aprire la comunicazione via Socket ...
  Il Server deve avere una connessione già aperta su questa porta }
ClientSocket1.Port:=9999;
If Edit1.Text<>'' then
 { Qui di sotto dico al Client l'indirizzo IP del Server a cui mi devo
connettere.
   Se non si è connessi ad internet tale indirizzo è l'indirizzo di Loopback
   (che generalmente vale 127.0.0.1) }
   ClientSocket1.Address:=Edit1.Text;
 { Attivo la socket ... attenzione, il Server deve essere attivo altrimenti
   non riesce a connettersi }
ClientSocket1.Active:=True;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
If Key=Chr(13) then begin
   Memo1.Lines.Add(edit2.text);
   { Semplicemente spedisco al Server il testo della Edit
     Generalmente in una architettura di rete Client - Server ciascun Client
     fa sempre riferimento al Server che si occupa di smistare i pacchetti }
   ClientSocket1.Socket.SendText(edit2.text);
   Edit2.clear;
   end;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.ReadOnly:=False;
  { Il comando Socket.Receivetext svuota il Buffer della Socket [tipo
string] }
  Memo1.Lines.add(Socket.ReceiveText);
  Memo1.ReadOnly:=True;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label3.Caption:='Connessione Attiva';
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label3.Caption:='Disconnesso';
end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label3.caption:='Tentativo di connessione...';
end;
end.
---- Fine Client ----
---- Server ----
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, WinSock, ScktComp;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Edit2: TEdit;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{ La funzione qui di sotto serve per ricavare l'indirizzo IP }
Function TrovaIP : String;
var
  WSAData: TWSAData;
  HostName: String;
  HostEnt: PHostEnt;
begin
  try
    WSAStartup(2,WSAData);
    SetLength(HostName,255);
    GetHostName(PChar(HostName),255);
    SetLength(HostName,StrLen(PChar(HostName)));
    HostEnt:=GetHostByName(PChar(HostName));
    with HostEnt^ do
    Result:=Format('%d.%d.%d.%d',
                   [Byte(h_addr^[0]),
                    Byte(h_addr^[1]),
                    Byte(h_addr^[2]),
                    Byte(h_addr^[3])]);
    WSACleanup;
  except
  MessageDlg('Impossibile rilevare indirizzo IP', mtError, [mbOK], 0);
  end;
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:=TrovaIP;
Edit1.ReadOnly:=True;
{ Anche qui seleziono la porta di comunicazione ... io ho scelto 9999, ma si
potrebbe
  scegliere qualsiasi altro numero(mi pare siano nell'ordine degli interi) }
ServerSocket1.Port:=9999;
{ Il comando qui sotto andrebbe posto in un blocco Try .. Except, perchè nel
caso
  in cui c'è già una comunicazione sulla porta socket quel comando
causerebbe una
  violazione ... }
ServerSocket1.Active:=True;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.ReadOnly:=False;
  Memo1.Lines.Add(Socket.receivetext);
  Memo1.ReadOnly:=True;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key=chr(13) then
   begin
     Try
        Memo1.ReadOnly:=False;
        Memo1.lines.add(edit2.text);
        Memo1.ReadOnly:=True;
        { Ecco qui una differenza tra il criterio di spedizione Client e
Server.
          In teoria il Client comunica solo con il Server, quindi non deve
specificare
          nulla di + dell'indirizzo IP, ma poichè il Server comunica con +
client deve
          "catalogarli" per decidere a quale spedire il messaggio!! In
questo caso è previsto
          un solo client che risponde a Connections[0] ... un secondo Client
verrebbe identificato
          come Connections[1] e così via }
        ServerSocket1.Socket.Connections[0].Sendtext(edit2.text);
        Edit2.clear;
     Except
        ShowMessage('Nessun Client di rete trovato');
    end;
   end;
end;
end.
---- Fine Server ----
Saluti
--
- Carlo -
c.b...@libero.it