Domanda

Ho bisogno di un piccolo aiuto, se di qualcuno ha ottenuto un minuto. Ho scritto un server Web utilizzando le porte di completamento IO, ma sto avendo qualche problema l'invio di file di grandi dimensioni. Le pagine Web sembrano carico bene, ma durante il trasferimento di file di grandi dimensioni, WSASend () fallisce dopo pochi minuti con l'errore "Il nome di rete specificato non è più disponibile".

In questo momento, il mio server solo chiude la connessione associata quando qualsiasi operazione sovrapposta fallisce. E 'questa la cosa giusta da fare? o dovrei riprovare fallito operazioni sovrapposte un paio di volte prima di chiudere la presa? Sto usando socket TCP / ruscello.

(fisso) Sono anche ricevendo quello che sembra casuale 0 pacchetti di byte da WSARecv. Io non sono sicuro di cosa fare di questo, o se il problema è correlato. (/ Fisso)

Grazie per qualsiasi aiuto

modifica: ora che il server gestisce correttamente le connessioni, e ha un registro molto più completo, sembra che Len è giusto. Il cliente sta chiudendo la connessione per qualche motivo.

Il log:

Initializing Windows Sockets...
Forwarding port 80...
Starting server...
Waiting for incoming connections...
Socket 1128: Client connected.
Socket 1128: Request received
Socket 1128: Sent response
Socket 1128: Error 64: SendChunk() failed. //WSASend()
Socket 1128: Closing connection - GetQueueCompletionStatus == FALSE

Quindi la domanda è ora, perché sarebbe il client chiudere la connessione? Prende ovunque da 2-5 minuti per accadere. Ho diminuita la dimensione del buffer di 4098 byte per inviare e inviare solo il blocco successivo quando il primo ha completato.

Grazie ancora per tutte le idee su questo.

P.S. Ho anche appena implementato una funzione di tentativi in ??modo che possa ripetere un'operazione IO fallito sovrapposti cinque volte prima di rinunciare .... ancora senza fortuna = (

È stato utile?

Soluzione 3

Finalmente capito.

da Rogers Internet Termini di servizio:

  

Senza limitazioni, non è possibile effettuare (o permettere ad altri di uso) i nostri servizi a:

     

(xvi) operano un server in connessione con i Servizi, tra cui, senza limitazione,> mail, notizie, dei file, Gopher, Telnet, chat, server Web, o di configurazione dell'host, multimediale> filanti o forum interattivi e multi-utente;

come lame è quello? O_o

una buona notizia: Server funziona bene =)

Modifica- chiamato Rogers. Hanno verificato che mi stanno tagliando fuori, e mi ha detto che ho bisogno di un conto business per eseguire un web server.

Altri suggerimenti

Un pacchetto di lunghezza zero tornati da recv indica client sull'altra estremità ha chiuso la connessione.
Quali risposte perché il vostro successiva send al client non è riuscita.

http://www.opengroup.org/onlinepubs/009695399/functions /recv.html

  

Se non ci sono messaggi sono disponibili per essere   ricevuto e il peer ha eseguito   shutdown ordinato, recv () ritorna   0.

Stai facendo di tutto per imporre una qualche forma di controllo del flusso sulla vostra trasmissione di dati?

Se poi non probabilmente si sta utilizzando le risorse che sta causando l'invio al sicuro.

Per esempio, se si sta semplicemente l'emissione di un sacco di WSASend() chiama uno dopo l'altro, piuttosto che camminare loro sulla base di quando si completa poi ognuno utilizzerà le risorse di sistema (riserva non di paging e / o le pagine di blocco che vanno verso il ' pagine bloccate limite '). Potrai quindi probabile che alla fine esito negativo con errori ENOBUFS o simili.

Quello che dovete fare è costruire un sistema di controllo del flusso che funziona fuori dei completamenti di invio in modo che sempre e solo dispone di un numero noto di manda in sospeso alla volta.

Vedere queste domande per maggiori dettagli:

implementare una buona esecuzione "to inviare" coda con TCP

Limitare TCP invia con un "to-be-inviato" coda e altri problemi di progettazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top