Newsgroup: it.comp.lang.c
Titolo: socket!!!!!!

qualcuno sarebbe cosi gentile di darmi una spiegazione
di socket non autobloccante o asincrono
so che si utilizza la funzione select(.......) e le relative macro
FD_SET  FD_CLR FD_ISSET qualcuno mi potrebbe allegare
un file sorgente che utilizza queso tipo di socket con relativa
spiegazione  in italiano
vi ringrazio della vostra disponibilità
ciao


La select si usa per il multiplexing, cioe' per gestire piu'
socket aperte (o anche stdin) senza sapere quale passera'
in stato disponibile a lettura, disp. a scrittura o presenza
dati fuori banda. Un esempio gia' compilabile e ben documentato
e' nella man page di Linux (man select) ma non l' ho qui con me.
Non avrai difficolta' a trocurartelo in altri modi.
La socket non bloccante e' un' altra cosa. si apre una socket normale
e si utilizza ioctl() per settare l' attributo non bloccante (o IOASYN
non ricordo).
Una accept non aspettera una connessione dal client, ma ritornera'
subito. Si puo' poi definire una funzione per gestire il signal
SIGIO per acquisire i dati quando disponibili. Il programma continuera'
e verra' ogni volta interrotto per IO asincrono.
ciao.

 wrote:
: qualcuno sarebbe cosi gentile di darmi una spiegazione
: di socket non autobloccante o asincrono
: so che si utilizza la funzione select(.......) e le relative macro
: FD_SET  FD_CLR FD_ISSET qualcuno mi potrebbe allegare
: un file sorgente che utilizza queso tipo di socket con relativa
: spiegazione  in italiano
: vi ringrazio della vostra disponibilità
: ciao
Nella man page della select(2) di Linux c'e' un piccolo esempio
che ti fa vedere come utilizzare le macro e questa chiamata di
sistema. Eccolo:
       #include <stdio.h>
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>
       int
       main(void)
       {
           fd_set rfds;
           struct timeval tv;
           int retval;
           /* Watch stdin (fd 0) to see when it has input. */
           FD_ZERO(&rfds);
           FD_SET(0, &rfds);
           /* Wait up to five seconds. */
           tv.tv_sec = 5;
           tv.tv_usec = 0;
           retval = select(1, &rfds, NULL, NULL, &tv);
           /* Don't rely on the value of tv now! */
           if (retval)
               printf("Data is available now.\n");
               /* FD_ISSET(0, &rfds) will be true. */
           else
               printf("No data within five seconds.\n");
           exit(0);
       }
Tale esempio utilizza un solo descrittore il che e' strano utilizzando
la select (a meno che tu non la voglia utilizzarla per mettere un timeout
ad una chiamata di sistema bloccante). Questo esempio utilizza due descrittori:
	/* porxy */
	FD_ZERO(&readset);
	while(1)
	{
		int readed;
		char buffer[1024];
		FD_SET(ns, &readset);	/* client socket */
		FD_SET(ts, &readset);	/* target socket */
		select((ns > ts)?ns+1:ts+1, &readset, NULL, NULL, NULL);
		if (FD_ISSET(ns, &readset))
		{
			readed = read(ns, buffer, 1024);
			if (readed <= 0)
			{
				/* gestisci l'eccezione */
				break;
			}
			write(ts, buffer, readed);
		}
		if (FD_ISSET(ts, &readset))
		{
			readed = read(ts, buffer, 1024);
			if (readed <= 0)
			{
				/* gestisci l'eccezione */
				break;
			}
			write(ns, buffer, readed);
		}
	}
Comunque questo quesito e' off-topic, la prossima volta per cortesia
posta le cose relative alla programmazione sotto unix in un ng adatto.
antirez


Scusate, non vorrei  polemizzare, vorrei solo capire dove il seguente ragionamento
risulta sbagliato: perche'  questi argomenti (socket, ecc.) dovrebbero
essere considerati OT, o peggio relativi alla programmazione sotto unix
(non mi dite che un programma che usa primitive come
 socket, select, ecc. nn funziona sotto Windows) ?
Voglio dire: e` vero che lo standard ISO/ANSI o comunque si chiami,
non prevede questo tipo di cose (programmazione "di rete" direi
in questo caso, non programmazione "sotto unix"),
ma e` altrettanto vero che esiste lo standard POSIX che l
e prevede (come prevede
anche altre cose non relative alla programmazione di rete).
Il POSIX e` uno standard molto piu` "lasco" dell'ANSI/ISO,
ma pur sempre standard e, secondo me, sarebbe bene
che qualsiasi sistema cercasse di rispettarlo, come dovrebbe
avvenire per l' ANSI/ISO per cui non mi sembra giusto relegare
queste cose a NG di piattaforma.
Io non conosco NG appositi che trattano lo standard POSIX, almeno
non in italiano, ma se ne esistono sarei grato se me li segnalaste.
Marco Guidi

 queste cose a NG di piattaforma.
Se
POSIX=ISO->IT
poichè invece
POSIX!=ISO->OT
Però risposte ne hai avute lo stesso. Essendo argomenti dipendenti dalla
piattaforma, è meglio chiedere dove si parla della piattaforma a cui si è
interessati, se non altro per avere risposte più dettagliate a da più
persone. Nota che Windows, pur usando i socket più o meno come nei sistemi
POSIX, offre anche altre interfacce alla programmazione di rete, più
semplici (forse), e non utilizzabili in altri sistemi.
Inoltre mi risulta che POSIX sia uno standard industriale, o de facto, e non
ufficializzato.
--
Alessandro Monti


In questo news group si risponde abitualmente a domande su Interrupt
o DJGCC, perche' parlare di POSIX.1 dovrebbe essere OT? Chi dice che
si parla solo di standard ANSI/ISO?
Sarebbe OT anche chi spiega un algoritmo, il fatto che lo codifichi
in C non lo rende comunque IT a voler interpretare le cose cosi'.
Suggerirei di non renderci la vita difficile come se la rendono
in it.comp.os.linux.sys.

 Sarebbe OT anche chi spiega un algoritmo,
Certamente, se questo riguarda problematiche completamente avulse
dall'argomento del newsgroup. Penso siano invece accettabili algoritmi
di uso generale.
EMG

 wrote:
:> Sarebbe OT anche chi spiega un algoritmo,
: Certamente, se questo riguarda problematiche completamente avulse
: dall'argomento del newsgroup. Penso siano invece accettabili algoritmi
: di uso generale.
C'e' differenza tra un algoritmo e la sua implementazione. Secondo me
non e' affatto off-topic illustrare l'implementazione di un dato algoritmo
in C mentre e' off-topic parlare dell'algoritmo in meta linguaggio.
antirez

 in C mentre e' off-topic parlare dell'algoritmo in meta linguaggio.
Se la discussione sull'algoritmo porta ad evidenziare principi e
tecniche generali allora, secondo me, è accettabilissimo.
EMG

 EMG
Scusate, ma visto che molte discussioni sono nate da una mia dimanda, vorrei
fare
alcune precisazioni. Scusate se non rispondero` ad eventuali repliche, ma
a- in questi giorni ho molto da fare
b- mi sembra che sull'argomento ci sia gia` stata una discussione sufficiente.
Premetto che visto che la maggioranza dei  frequentatori del NG sembra
contraria
a trattare l'argomento "programmazione di rete", mi asterro` d'ora in poi dal
rispondere a qualsiasi  domanda ad esso relativa,  almeno  pubblicamente.
In ogni caso:
punto 1.
Qualcuno ha fatto riferimento ad un recente aggiornamento del manifesto den NG.
A me non sembrava che su it.comp.lang.c fosse stato postato recentemente un
manifesto del NG, a differenza di quanto e` stato fatto su it.comp.lang.c++.
Forse non l'ho visto perche` negli ultimi giorni non ho avuto tempo di seguire
molto
i vari NG.
punto 2.
Scusate la franchezza, ma sono proprio ffermazioni, come quella sopra
quotata che non capisco (per una volta non sono molto d'accordo con EMG,
con il quale invece ho avuto finora una certa 'sintonia di opinioni').
Perche` una discussione su un algoritmo che porta ad evidenziare tecniche
generali e` accettabile, mentre una discussione su tecniche di programmazione
di rete non lo e`  ? Tali tecniche sono standardizzate per i sistemi POSIX
compliant,
per cui a me sembrano generali. Invece ad esempio una discussione sui
WinSock sarebbe specifica di piattaforma, secondo me. Se poi i WinSock
sono una interfaccia alla comunicazione piu` semplice rispetto allo standard,
a me non pare significativo. Ad esempio il Visual C++ potrebbe rendere
disponibili
delle classi per la gestione delle stringhe piu` abbordabili di quelle della
libreria
standard del C++, ma questo non mi sembra un buon argomento per non trattare
std::string su it.comp.lang.c++.
E` vero che non tutti coloro che scrivono in C si devono preoccupare
di programmazione di rete, ma allo stesso modo, ad esempio,  mica tutti quelli
che programmano
in C++ devono preoccuparsi del paradigma ad oggetti, visto che il C++ supporta
vari paradigmi (ad esempio io per fare la tesi avevo scritto in C++ un
simulatore che
implementava lo strato di memory management di un S.O. paginato: polimorfismo
ed
ereditarieta` erano visti abbastanza come fumo negli occhi),
tanto piu` che esistono appositi NG sull'ingegneria del software,
anche in italiano. Pero` e` stato ritenuto che l'argomento
"tecniche di programmazione ad oggetti" fosse IT su it.comp.lang.c++.
E io concordo.
Per quanto ne so io, NG sullo standard POSIX non ne esistono e quello che mi
sembrava
avvicinarsi di piu` era una NG sul linguaggio C.
Per la verita` non conosco nemmeno NG che si occupano in generale di
programmazione
di rete, se non un NG che credo essere giapponese in cui alcuni messaggi non si
leggono molto bene per ovvi motivi (caratteri giapponesi).
Marco Guidi

 programmazione di rete,
Non è un buon motivo per parlarne qui, o questo deve diventare il
rifugio delle anime in pena? :-)
EMG

 che programmano
Personalmente ho solo fatto notare che forse su questo NG non troveresti
risposte abbastanza esaurienti e qualificate perchè probabilmente non tutti
quelli che frequentano questo NG sanno cos'è il POSIX, me compreso (a parte
le cose elementari), mentre è probabilmente vero che sui NG dedicati a Unix
nelle sue varie forme sul POSIX ci mangiano tutti i giorni.
Tutto qui.
Pensavo di fare solo un favore; non volevo (parlo solo a nome mio) fare un
dibattito su cosa è OT e cosa no, ma solo far notare che Posix è tipico non
tanto del C ma di Unix, magari programmato in C :-)
--
Alessandro Monti