2010-08-09 10 views
6

Ho un'applicazione server basata su Winsock che utilizza le porte di completamento I/O Windows Winsock.Winsock - interrompe l'accettazione di nuove connessioni, ma continua a comunicare con le connessioni esistenti

Come tale, ogni connessione accettata è associata alla presa di ascolto per iniziare a ricevere notifiche (leggi, scrivi, chiudi ecc.).
Il socket di ascolto ha un backlog di 100 connessioni in sospeso.
Tutto va bene.

A un certo punto, desidero interrompere l'accettazione di nuove connessioni e mantenere la comunicazione con socket già esistenti collegati.

ho pensato che avrei potuto fare una di:

  1. arresto chiamando WSAAccept().
  2. Imposta il backlog su zero, in modo efficace non consentendo alcuna connessione a pend.
  3. Arresto chiamate() & closesocket() sulla presa di ascolto.

Ora, l'opzione n. 1 fornisce i risultati previsti; La mia applicazione non elabora nuove connessioni, MA accetta fino alla quantità del backlog (100). I collegamenti sono fatti praticamente - non lo voglio!

Opzione n. 2; Posso farlo? Come? Impossibile trovare su MSDN né su google. La documentazione di listen() su MSDN dice;

Se la funzione di ascolto viene chiamato su un presa già ascoltando, lo farà ritorno successo senza modificare il valore per il parametro backlog. Impostando il parametro backlog su 0 in una chiamata successiva per l'ascolto su un socket di ascolto non è considerata un ripristino corretto , in particolare se ci sono connessioni sul socket.

Non va bene per me.
Se potessi farlo in un modo sicuro, lo combinerei con l'opzione n. 1, fermandomi effettivamente con lo stabilire nuove connessioni sulla macchina (attraverso la porta di ascolto!).

L'opzione n. 3 funziona effettivamente; Dopo aver chiuso la presa d'ascolto posso ancora comunicare con le connessioni esistenti, e l'arretrato è scomparso (beh, chiudere la presa d'ascolto!).

La mia preoccupazione è che questo approccio potrebbe avere alcuni effetti collaterali. Qualcuno può confermare?

risposta

8

È sufficiente chiudere la presa di ascolto. Le connessioni accettate hanno le proprie prese e non saranno interessate dalla chiusura della presa di ascolto.

Ad esempio, nella documentazione Microsoft c'è a sample server application dove viene dimostrato l'utilizzo di base del socket. Lì la presa di ascolto è chiusa prima che venga effettuata la comunicazione sul socket accettato (prima del do-while-loop).

+0

Sì, il n. 3 è la risposta giusta. –

+0

Ottima risposta!La "prova" è esattamente ciò di cui avevo bisogno per la pace della mente !! Vedi, temevo che l'associazione della nuova connessione con la presa d'ascolto IOCP avrebbe creato qualche dipendenza. Grazie ancora! – Poni

Problemi correlati