Aller: des expressions du FOLKLORE lors de la lecture à partir d'une prise
J'ai le simple suivant golang programme pour télécharger de la politique de confidentialité de Google. Malheureusement, il se bloque toujours avec l'erreur unexpected EOF
après la lecture de la 6861 octets, même si le document est beaucoup plus long. Pourquoi?
package main
import "net"
import "fmt"
import "io"
import "os"
func die(msg string, s os.Error) {
fmt.Printf("%s crashed: %v\n", msg, s)
os.Exit(1)
}
func main() {
fd, err := net.Dial("tcp", "google.com:80")
if err != nil { die("dial", err) }
req := []byte("GET /intl/en/privacy/HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
_, err = fd.Write(req)
if err != nil { die("dial write", err) }
buf := make([]byte, 1024)
nr := 1
for nr > 0 {
nr, err = io.ReadFull(fd, buf)
if err != nil { die("dial read", err) }
fmt.Printf("read %d\n", nr)
}
}
sorties:
read 1024
read 1024
read 1024
read 1024
read 1024
read 1024
dial read crashed: unexpected EOF
OriginalL'auteur aaronsw | 2011-10-29
Vous devez vous connecter pour publier un commentaire.
Fonction
io.ReadFull(fd, buf)
doit être utilisé uniquement lorsque vous savoir quefd
peut nourrir au moinslen(buf)
octets.Au lieu de cela, essayez ce qui suit:
Si la copie d'un fichier, utilisez un
os.File
au lieu debytes.Buffer
.OriginalL'auteur
Vous pouvez également obtenir la taille du fichier d'en-têtes HTTP, et de la lecture pour que la longueur de votre support. Regarder pour le Contenu-Longueur de l'en-tête de réponse.
Vous devez toujours connaître la taille de ce que vous vous déplacez avec IO, quand c'est un fichier et possible, et de limiter votre lecture à la taille attendue. Cela permettra d'éviter beaucoup de problèmes.
pseudo:
OriginalL'auteur Neil
Le document n'est pas beaucoup plus long. C'est seulement 412 octets plus. Sine ReadFull ne peut pas lire tous les 1024 octets qu'il retourne
unexpected EOF
.OriginalL'auteur Piotr Praszmo