View Full Version : [C++] Socket queue
Ciao Ragazzi,
è possibile sapere la dimensione della coda di socket.
Praticamente io ho un server che invia ad un client una certa mole di dati, e con connessioni lente (tipo modem 56 K) capita che il server non riesca ad inviare i dati al client e li tenga in coda, questa coda aumenta facendo aumentare la memoria occupata dall'applicativo server(praticamente quello che si vede nel Task Manager).
La soluzione ideale sarebbe conoscere la dimensione della coda da poter cosi fissare un massimo e fermare temporaneamente l'invio finchè la coda non rientra nei livelli prestabiliti.
Ciao Zelig
ilsensine
22-04-2005, 16:21
Dovrebbe essere gestito automaticamente da s/o. Non so come funzionino le cose sui winsock, ma è ragionevole che ci sia un limite oltre il quale il socket non permette scritture "atomiche". Questo vuol dire che il tuo programma non dovrebbe continuare a richiedere memoria indefinitamente. L'unica spiegazione che ho è che stai usando un layer di astrazione con i winsock che contiene un proprio buffer interno, che viene lasciato crescere senza limiti ragionevoli.
Dovrebbe essere gestito automaticamente da s/o. Non so come funzionino le cose sui winsock, ma è ragionevole che ci sia un limite oltre il quale il socket non permette scritture "atomiche". Questo vuol dire che il tuo programma non dovrebbe continuare a richiedere memoria indefinitamente. L'unica spiegazione che ho è che stai usando un layer di astrazione con i winsock che contiene un proprio buffer interno, che viene lasciato crescere senza limiti ragionevoli.
Sono daccordo sul fatto che ci sia un limite, quello che vorrei sapere è se sia possibile sapere qual'è questo limite, in modo da poterlo gestire.
Grazie
ilsensine
22-04-2005, 16:38
Non essendo un esperto di winsock non so risponderti a questa domanda (dovresti vederlo facilmente in winsock2.hlp, distribuito con molti compilatori); ti segnalavo solo la possibilità che il problema potesse essere altrove, se non usi winsock direttamente.
ilsensine
22-04-2005, 16:48
Cmq una rapida ricerca con Google rivela che hai a disposizione la classica funzione BSD getsockopt che ti consente di vedere la dimensione dei buffer in tx e rx (SO_RCVBUF e SO_SNDBUF). Il problema tuo è sapere quanto del buffer è attualmente utilizzato; sotto i sistemi unix si usa una ioctl.
Cmq una rapida ricerca con Google rivela che hai a disposizione la classica funzione BSD getsockopt che ti consente di vedere la dimensione dei buffer in tx e rx (SO_RCVBUF e SO_SNDBUF). Il problema tuo è sapere quanto del buffer è attualmente utilizzato; sotto i sistemi unix si usa una ioctl.
Infatti avevo trovato anche io quella funzione ma effettivamente non fa quello che chiedo,
cioè quanto del buffer è attualmente utilizzato.
Grazie cmq
ciao zelig
ilsensine
22-04-2005, 17:11
Comunque se leggi la documentazione delle winsock vedrai che WSASend (e send) è bloccante se il buffer è pieno e il socket è bloccante, oppure "rifiuta" i dati se il buffer è pieno e il socket non bloccante. Quindi le winsock non possono essere l'origine del consumo di memoria "illimitato".
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.