Windows Sockets: blocco
In questo articolo e due articoli correlati vengono illustrati diversi problemi nella programmazione di Windows Sockets.In questo articolo riguarda il blocco.Le altre problematiche vengono analizzate articoli: Windows Sockets: ordinamento di byte e Windows Sockets: Conversione delle stringhe.
Se si utilizza o derivata dalla classe CAsyncSocket, sarà necessario gestire questi problemi manualmente.Se si utilizza o derivata dalla classe CSocket, MFC le gestisce automaticamente.
Blocco
Un socket può essere “nella modalità di blocco„ o “in modalità non bloccante.„ Le funzioni sockets in modalità sincrona o (di blocco) non restituiscono finché non possano completare la loro azione.Si tratta di blocco perché il socket la cui funzione è stata chiamata non può eseguire qualsiasi operazione — è bloccato — fino ai risultati della chiamata.Una chiamata alla funzione membro di Receive , ad esempio, potrebbe richiedere arbitrariamente molto tempo come attendere che l'applicazione di invio inviare si tratta se si utilizza CSocket, utilizzando CAsyncSocket con il blocco.Se un oggetto di CAsyncSocket è in modalità non bloccante (eseguite in modo asincrono), nei risultati della chiamata immediatamente e nel codice di errore corrente, recuperabile con la funzione membro di GetLastError , è WSAEWOULDBLOCK, indicando che la chiamata sarebbe stato bloccato lo ha apportato non restituire immediatamente a causa della modalità.(CSocket non restituisce mai WSAEWOULDBLOCK.La classe gestisce il blocco dell'utente.
Il comportamento di socket è diverso con il 32 bit e i sistemi operativi a 64 bit (quali Windows 95 o Windows 98) che con i sistemi operativi a 16 bit (quali Windows 3.1).A differenza dei sistemi operativi a 16 bit, il 32 bit e i sistemi operativi a 64 bit utilizzano il multitasking di tipo preemptive e forniscono il multithreading.Con la versione a 32 bit e i sistemi operativi a 64 bit, è possibile inserire i socket nei thread di lavoro distinti.Un socket in un thread può bloccare senza interferire con le attività nell'applicazione e senza impiegare il tempo di calcolo nel blocco.Per informazioni sulla programmazione multithreading, vedere l'articolo multithreading.
[!NOTA]
Nelle applicazioni multithread, è possibile utilizzare la natura del blocco di CSocket per semplificare la progettazione del programma senza influire sulla risposta dell'interfaccia utente.Gestendo le interazioni dell'utente nel thread principale e in CSocket che elaborano in thread alternativi, è possibile separare queste operazioni logiche.In un'applicazione che non è multithreading, queste due attività devono essere combinati e gestite come un singolo thread, che in genere significa utilizzando CAsyncSocket in modo che sia possibile gestire le richieste di comunicazioni su richiesta, oppure eseguendo l'override di CSocket::OnMessagePending per gestire le azioni dell'utente durante un'attività di lunga durata sincrona.
Il resto di questa discussione ai programmatori che utilizzano i sistemi operativi a 16 bit:
In generale, se si utilizza CAsyncSocket, si consiglia di evitare l'utilizzo di operazioni di blocco ed eseguire in modo asincrono anziché.Nelle operazioni asincrone, dal punto in cui si riceve un codice di errore WSAEWOULDBLOCK dopo aver chiamato Receive, ad esempio, si attendono finché non viene chiamato la funzione membro di OnReceive per indicare che è possibile leggere ancora.Le chiamate asincrone vengono eseguite chiamando nuovamente la funzione di notifica di callback appropriata del socket, come OnReceive.
In windows, le chiamate di blocco si utilizza una pratica.Per impostazione predefinita, CAsyncSocket supporta le chiamate asincrone ed è necessario gestire il blocco utilizzando le notifiche di callback.La classe CSocket, invece, è sincrona.Pompa i messaggi di windows e gestisce il blocco automaticamente.
Per ulteriori informazioni sul blocco, vedere la specifica di Windows Sockets.Per ulteriori informazioni sulle funzioni " ON ", vedere Windows Sockets: Notifiche di socket e Windows Sockets: Derivazione dalle classi di socket.
Per ulteriori informazioni, vedere: