Newsgroup: it.comp.programmare.win32
Titolo: CAsyncSocket

Ciao, vorrei realizzare una semplice applicazione che mi restituisca il
numero di byte che passano per una porta. Da quanto ho capito devo
istanziare un oggetto di tipo CAsyncSocket, poi crearlo e infine posso
chiamare il metodo Receive, che restituisce appunto i byte passati. In
questa funzione membro però è richiesto come parametro un puntatore ad un
buffer, ma io non lo creo mai nei passi precedenti. Come funziona un oggetto
CAsyncSocket?
db1...@libero.it

,

La porzione di codice che segue riporta, in modo molto sintetico, la
creazione di un oggetto stream socket al lato client:
- creazione del socket
- richiesta di connessione ad un indirizzo IP e ad un numero di porta
noti
... ... ...
n = m_MySocket.Create(0, SOCK_STREAM, NULL);
	// Richiesta di connessione alla porta ServerPort
	if (m_MySocket.Connect(ServerIpAddress, ServerPort))
	{
... ... ...
Se nella Create il primo parametro vale 0, allora la porta verrà
automaticamente scelta da Windows (tra 1025 e 5000).
Per il lato server si devono invece eseguire le operazioni seguenti:
- creazione del socket
- attivare l'oggetto socket in ascolto di eventuali richieste di
connessioni
- raccogliere richieste di connessioni
... ... ...
CAsyncSocket ConnectedSocket;
... ... ...
ServiceSocket.Create(ServerPort, SOCK_STREAM, NULL);
ServiceSocket.Listen(n);
ServiceSocket.Accept(ConnectedSocket, NULL, NULL);
... ... ...
In questo caso il numero di porta nella Create deve essere noto per
permettere la connessione dei client.
Il primo parametro dell'Accept è l'oggetto socket che si prende cura
della connessione stabilita.
Una volta instaurato il collegamento client-server è possibile
utilizzare i metodi di Send e Receive per effettuare lo scambio dei
dati via socket.
Per entrambi i metodi il valore di ritorno è un intero che
rispettivamente indica il numero di caratteri inviati dal socket ed il
numero di caratteri ricevuti dal socket.
Tieni presente che il metodo di Receive è "bloccante" per
l'applicazione; vale a dire che il tuo programma si blocca a questa
funzione sino a che non giungono dei dati al socket.
Per superare questa limitazione puoi utilizzare il metodo OnReceive che
si scastena quando sul socket pervengono dei dati.
In questo modo è sufficiente inserire l'istruzione di Receive
all'interno della OnReceive.
Sent via Deja.com 
http://www.deja.com/
Before you buy.




 buffer, ma io non lo creo mai nei passi precedenti...
Volevo spiegarmi meglio per quanto riguarda l'uso del metodo Receive, e
a tal fine penso che un esempio valga piů di molte parole.
Di seguito riporto un esempio di utilizzo del metodo OnReceive dove
puoi vedere l'uso della Receive e del buffer che si deve utilizzare.
Per poterla utilizzare in questo modo devi definire una tua classe
(MyClass) che eredita dalla CSocket (che a sua volta eredita dalla
CAsyncSocket) e devi ridefinire il metodo OnReceive:
------------------------------------------------------------------
// .h
# include <afxsock.h>
class MyClass: public CSocket
{
   ...
   CString m_csBuffer;
   ManageMessage();
   virtual void OnReceive(int nErrorCode);
   ...
};
------------------------------------------------------------------
------------------------------------------------------------------
// .cpp
...
// Funzione che intercetta dati disponibili sul socket
void CMyClass::OnReceive(int nErrorCode)
{
	char cBuffer[MSG_BUFFER_LENGTH];
	int nLengthMsg,i;
	// Inizializzazione del buffer
	m_csBuffer = IDS_NULL;
	nLengthMsg = Receive(&cBuffer, MSG_BUFFER_LENGTH, 0);
	LPSTR lpMem = m_csBuffer.GetBuffer(nLengthMsg);
	memcpy(lpMem,cBuffer,nLengthMsg);
	m_csBuffer.ReleaseBuffer();
	if (nLengthMsg > 0)
	{
		// Funzione di gestione dei messaggi pervenuti
		ManageMessage();
	}
}
--------------------------------------------------------------------
Spero ti sia di aiuto.
Ciao
Roby


