Newsgroup: it.comp.www.php
Titolo: il mistero dei socket

Ciao a tutti,
 
stato facendo dei test con uno script php per realizzare una applicazione 
server. Ho problemi perch� quando vado a chiudere il socket, la parte server 
ossia la porta 1111 (la mia porta di test) che era in ascolto, si chiude 
mentre mi rimane in piedi questa parte della comunicazione
 
ip remoto        porta remota            porta locale
192.168.1.82    59499                      1111 
000:07:52 Attesa-tempo
 
che mi impedisce di avviare di nuovo il server. Finch� non termino a mano 
anche questa parte, se provo a rilanciare lo script myserver ottengo questo 
errore:
 
Warning: socket_bind(): unable to bind address [67]: Il nome del socket � 
gi� in uso
 
Tra l'altro giocherellando con netstat mi sono accorto che ho molte righe in 
questa situazione che riguardano in particolar modo le mie applicazioni web:
 
 
192.168.1.30    41215    80 000:12:48 Attesa-tempo
192.168.1.30    41218    80 000:12:40 Attesa-tempo
192.168.1.30    41221    80 000:12:38 Attesa-tempo
192.168.1.30    41223    80 000:12:37 Attesa-tempo
192.168.1.30    41226    80 000:12:37 Attesa-tempo
192.168.1.30    41228    80 000:12:37 Attesa-tempo
192.168.1.30    41231    80 000:12:37 Attesa-tempo
192.168.1.30    41232    80 000:12:37 Attesa-tempo
192.168.1.30    41233    80 000:12:37 Attesa-tempo
192.168.1.30    41236    80 000:12:37 Attesa-tempo
192.168.1.30    41237    80 000:12:37 Attesa-tempo
192.168.1.30    41240    80 000:12:37 Attesa-tempo
192.168.1.30    41241    80 000:12:37 Attesa-tempo
192.168.1.30    41247    80 000:12:36 Attesa-tempo
192.168.1.30    41249    80 000:12:36 Attesa-tempo
192.168.1.30    41251    80 000:12:35 Attesa-tempo
192.168.1.30    41256    80 000:12:35 Attesa-tempo
192.168.1.30    41258    80 000:12:35 Attesa-tempo
192.168.1.30    41259    80 000:12:35 Attesa-tempo
192.168.1.30    41260    80 000:12:35 Attesa-tempo
192.168.1.30    41261    80 000:12:35 Attesa-tempo
192.168.1.30    41263    80 000:12:35 Attesa-tempo
192.168.1.30    41265    80 000:12:35 Attesa-tempo
192.168.1.30    41267    80 000:12:35 Attesa-tempo
 
Sapreste illuminarmi su come posso gestire questa situazione?
 
ConteZero
 

 giï¿½ in uso

I socket lato server rimangono in time-wait per qualche minuto. E' normalissimo e dipende dall'architettura delle comunicazioni TCP-IP.
Per quanto riguarda il binding, se vuoi fare in modo di fare bind su una porta giù utilizzata (e quindi anche se il programma muore e lo vuoi aprire subito dopo) devi impostare il socket su SO_REUSEADDR con una setsockopt().
Ciao!

 Ciao!
 
Grazie della risposta: ho notato che lato server i socket rimangono su per
circa 15 minuti. Non so per� dire se � un tempo troppo lungo o giusto. I
miei utenti spesso lavorano per molto tempo sempre sullo stesso programma.
Il fatto che i socket rimangano su aiuta nelle prestazioni o non centra
nulla? 
 
Provo a gestire il binding con l'opzione che mi hai suggerito.
 
ConteZero
 
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

 prestazioni o non centra nulla?
 
I socket rimangono su finche` non ricevono il segnale di chiusura dal 
client, quindi se i client sono accesi con il socket aperto, il (kernel 
del) server aspetta il timeout, che probabilmente sulla tua macchina e` 
impostato a 15 minuti.
 
Se puoi cambiare l'architettura dei client, potresti cambiare il tuo 
protocollo per mandare un segnale "sto per chiudermi" ai client, che a 
loro volta possono chiudere la connessione (ed eventualmente avvisare 
l'utente che il server sta per sparire). In questo modo diminuisci il 
tempo di attesa.
 
In alternativa (sempre se puoi modificare i client) puoi usare un tipo di 
connessione piu` "usa e getta" (alla HTTP): il client si connette, chiede 
i dati, il server risponde, il client chiude subito la connessione, e la 
riapre quando gli serve.
 
Bye.

 
 
Vai sicuro.
 
Ciao!

Bye.
 
Sicuramente per quanto sto andando a realizzare, il client lo scrivo io 
quindi farò in modo di gestire correttamente
la chiusura dei socket come mi avete suggerito.
Quelli che mi rimangono in piedi ora invece sono socket sulla porta 80 che 
vengono aperti dalle nostre applicazioni web e
rimangono su 15 minuti. Non riesco a capire quindi se è normale che questi 
socket siano così tanti e rimangano su tutto questo tempo. E' vero che 
avendo dei rich client javascript le richieste che fa il browser per ogni 
videata sono diverse però mi sembra che il numero dei socket rimangono li 
sia un numero spropositato .... Non so ...
 
Grazie
 

 così tanti e rimangano su tutto questo tempo.
 
Prova a vedere il keepalive sul webserver, e il suo timeout e maxrequests.
 
Di default dovrebbe essere 5 secondi di timeout e 100 richieste per 
connessione, quindi teoricamente (con client che fanno richieste piu` 
spesso di 5 secondi) 500 secondi, cioe` meno di 10 minuti.
Magari hai un 200 su maxrequests, o 10 secondi di timeout (che 
corrispondono piu` o meno a 15 minuti)
 
Te lo dico in via teorica, perche` non ho effettivamente mai avuto 
problemi di timeout cosi` lunghi.
 
Bye.

sia un numero spropositato .... Non so ...
 
Se il problema e' relativo a quello che hai postato anche su it.comp.as400,
tieni  presente che lo stesso as400 (se non opportunamente istruito in merito)
potrebbe ad ogni richiesta di connessione aprire un nuovo job e lasciarlo aperto
per un certo periodo di tempo (e da netstat ne troveresti le tracce, n.b. e'
comportamento assolutamente normale nel default di quel sistema) 

 comportamento assolutamente normale nel default di quel sistema)
Si � lo stesso: lo avevo postato li perch� speravo che qualche
"quattrocentista" esperto poteva darmi qualche speigazione ... 
 
Sai forse spiegarmi meglio cosa intendi per "opportunamente istruito"?


 Bye.
 
ok provo ... grazie


Sai forse spiegarmi meglio cosa intendi per "opportunamente istruito"?
 
Se ho ben capito l'architettura del tuo lavoro hai uno script che via socket si
collega ad un as/400, occorrerebbe sapere anche cosa fa il socket, tipo richiama
un pgm rpg o cobol dell'as o altro.
Supponiamo che richiami in esecuzione un pgm rpg o cobol, in questo caso tieni
presente che di massima il sistema operativo dell'as/400 crea (in una
configurazione di default) un c.d. job ad ogni richiesta, ciascuno di questi job
effettua il suo ciclo di operazioni e poi termina, a questo punto dovrebbe
essere compito del/dei pgm che hanno girato su as/400 di chiudere/recuperare
tutte le risorse utilizzate, se questo non viene fatto esplicitamente (e non
esiste un comando magico che lo faccia dipende caso per caso quali risorse del
sistema siano state utilizzate) il comportamento di default del sistema prevede
che il job (meglio le risorse impiegate dai pgm che hanno operato nel job)
rimangano "aperte" per un certo tempo, la quantita di job che si potrebbero
aprire e' desumibile  dalla configurazione del sottosistema QZRCSRVS la durata
e' in genere di 60 minuti. 
Per ovviare alla configurazione del sistema occorre che il pgm lanciato in
esecuzione chiuda tutte le risorse che va ad impegnare, oppure modificare il
lavoro di default che prima dei 60 minuti standard provveda alla chiusura dei
job inattivi.
Senza sapere di piu' del tuo lavoro pero' e' ben difficile dirti dove andare a
guardare.

 
 
"Suarez"  ha scritto nel messaggio 
news:au7m381nsfeb5nf2q...@4ax.com...

No al momento non lancio alcun programma lato as400  e non faccio alcuna 
connessione al DB quindi non apro alcun job
Sono solo in ambiente PHP in quanto sto facendo dei test.
Quello che mi rimane aperto per 15 minuti č socket di comunicazione con il 
client: questo anche relativamente all'applicazione web che gira sul nostro 
as400. Quando un utente esegue il log out tutti i lavori si chiudono tranne 
i socket tcp aperti con il client che rimangono li per 15 minuti
 
ConteZero 
 

 ConteZero
 
Visto che ancora hai lo stesso problema posto la stessa risposta di prima, ma po' più precisa:
i socket rimangono in time-wait? o in un altro stato?
Questa è la domanda *fondamentale*. Nel secondo caso è colpa tua, nel primo (in caso ti dia dei problemi, cosa che non credo) devi fare dei tweak a livello di sistema operativo.
Ciao!

Ciao!
 
Purtroppo il mio server parla italiano e dice "attesa-tempo" ma penso sia 
l'equivalente di time-wait.
 
ConteZero