Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - sockets
Forum - Pascal - sockets

Avatar
giosch (Normal User)
Rookie


Messaggi: 23
Iscritto: 16/03/2011

Segnala al moderatore
Postato alle 22:15
Mercoledì, 06/04/2011
Salve, volevo qualche brivido in più e ho iniziato a leggere di questa unit.
QUalcuno sa fornirmi qualche spiegazione base dato che la mia documentazione è poco chiara (http://www.freepascal.org/docs-html/rtl/sockets/index-5.html)?
Ve ne sarei molto grato. E se avete anche qualche programma dimostrativo sarebbe utile. Attendo risposte,
Giosch

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 14:26
Giovedì, 07/04/2011
Ciao giosch,

Se sai l'inglese e se guardi in rete troverai sufficienti giude.

Ad ogni modo ti posto questo esempio.
E' un programma che permette di chattare sullo stesso computer.
Funziona così :
Esegui il programma, scegli che una finestra sia il server, poi lo riesegui e scegli client. Ora potrai comunicare fra le due finestre. Quando viene inserito un messaggio vuoto i programmi vengono chiusi.

Io ti spiegerò un po' come funziona, poi compilalo ed esegui il debug per capirlo meglio.

Poi cercare altri esempi sul sito. Tempo fa caricai un programma che permetteva di chattare su LAN.

Codice sorgente - presumibilmente Delphi

  1. Program mychat;
  2.  
  3. uses Sockets, crt;
  4.  
  5. Var
  6. sc:char;
  7. Buffer : string[255];
  8. S       : Longint;
  9. Sin,Sout   : Text;
  10. SAddr      : TInetSockAddr;
  11. Com        : Boolean;
  12. Nome       : String;
  13.  
  14.  
  15. procedure perror (const S:string);
  16. begin
  17.   writeln ('Errore --> ',S,SocketError);
  18.   readln;
  19.   halt(100);
  20. end;
  21.  
  22.  
  23. BEGIN
  24.  
  25.  S:=Socket (AF_INET,SOCK_STREAM,0);
  26.  if SocketError<>0 then Perror ('Socket : '); //
  27.  SAddr.sin_family:=AF_INET;
  28.  SAddr.sin_port:=htons(50000); //  porta 50000, puoi sceglierne un'altra
  29.  SAddr.sin_addr.s_addr:=hosttonet((127 shl 24)or 1); //indirizzo IP locale
  30.  
  31.  writeln('Vuoi esser client o server (immetti c/s)');
  32.  repeat readln(sc); until (sc='c') or (sc='s');
  33.  
  34.  if sc='s' then begin
  35.  
  36.   nome := 'server';
  37.   if not Bind(S,SAddr,sizeof(saddr)) then PError ('Server : Bind : ');
  38.   if not Listen (S,1) then PError ('Server : Listen : ');
  39.  
  40.   Writeln('Sono in attesa di un client ... ');
  41.   if not Accept (S,Saddr,Sin,Sout) then PError ('Server : Accept : ')
  42.   else writeln('Client connesso, aspetta il suo primo messaggio');
  43.  
  44.  end else begin
  45.  
  46.   nome := 'client';
  47.   if not Connect (S,SAddr,Sin,Sout) then PError('Client : Connect : ')
  48.   else writeln('Sei connesso al server, invia tu il primo messaggio');
  49.  
  50.  end;
  51.  
  52.  writeln('Inserisci una stringa vuota per terminare la comunicazione');
  53.  writeln;
  54.  com := true;
  55.  Reset(Sin);
  56.  
  57.  if sc='c' then begin  //Il client invia il primo messaggio
  58.   ReWrite(Sout);
  59.   buffer := '';
  60.   textcolor(14);  readln(buffer);  textcolor(7);
  61.   writeln(Sout,buffer);
  62.   if length(Buffer)=0 then begin
  63.    com:=false;
  64.   end;
  65.  end;
  66.  
  67.  while com do begin    // Comunicazione
  68.   Readln(Sin,Buffer);
  69.   writeln(' Messaggio dal ', nome );
  70.   if length(Buffer)=0 then begin
  71.    com:=false;
  72.    continue;
  73.   end;
  74.   textcolor(14); writeln(buffer); textcolor(7);
  75.   ReWrite(Sout);
  76.   buffer := '';
  77.   writeln(' Scrivi un messaggio per il ', nome);
  78.   textcolor(14);
  79.   readln(buffer);
  80.   textcolor(7);
  81.   writeln(Sout,buffer);
  82.   if length(Buffer)=0 then begin
  83.    com:=false;
  84.    continue;
  85.   end;
  86.  end;
  87.  writeln;
  88.  writeln('Comunicazione terminata');
  89.  readln;
  90.  
  91. END.



Esaminiamo il programma:
Utilizza Socket che crea l'handle della socket
Se la funziona ha, erroneamente, restituito zero, dà errore.
Imposta la variabile TInetSockAddr. (leggi la guida)
Se scegli client, il programma prova a connettersi al serve, altrimenti il server richiede un indirizzo(bind) e si mette in ascolto (listen e accept).
I parametri Sin e Sout fa sì che la comunicazione fra le 2 socket avvenga come la lettura e la scrittura su questa variabili Text.

Ultima modifica effettuata da Phi il 07/04/2011 alle 14:36
PM Quote