2017-05-02 3 views
-1

Ma tâche à la maison était d'écrire un outil qui va transférer de grandes données via des sockets. L'idée principale derrière mon code n'est pas trop sophistiqué, donc je vais juste donner pseudo-code suivant:différentes erreurs inattendues lors de la construction avec l'option -pg

alignas(4) struct package : 
    uint8_t type , is_eof , padding[ 2 ] ; 
    uint32_t size , checksum ; 
    uint8_t data[ large_size ] ; 

function send : 
    read amount of data to the "package" (with std::istream::read) ; 
    form a "package" : load gcount() of read bytes, checksum, etc. 
         (hton* are used on this step) ; 
    send "package" (sendall from beej's guide) ; 
    wait for approve package ; 

function receive : 
    receive a "package" (recv with MSG_WAITALL) ; 
    unpack : calc checksum and check (crc), etc ; 
    write data to ostream (std::ostream::write) ; 
    send approve package ; 

Surchauffe régulière (g ++ - 5) tout fonctionne parfaitement comme prévu - l'expéditeur envoie des données, le récepteur reçoit , vérifie et envoie une réponse. De plus, en raison de mes repères naïfs sur le réseau local, il ne fonctionne que 1.5x plus lent que le transfert via ftp.)

Mais quand j'ajoute « -pg » drapeau g d'options de ++, après quelques paquets receiver commence à recevoir des colis avec des ordures.

Quelqu'un a-t-il une idée de ce qui se passe?

Répondre

0

Je ne sais pas comment vous obtenez vos prises donc c'est une supposition sauvage basée sur un problème similaire, j'ai vu en 2003 ou si:

Vous avez un code qui est « obligeamment » fermeture du fichier Unix Descripteurs de 3 à 1024 (ou 4096, ou NOFILE, etc.). Et puis en réutilisant FD 3 pour une socket.

ASTUCE: PROFIL UTILISE UN DESCRIPTEUR DE FICHIER.

Dans mon problème similaire dans le passé, le socket ouvert sur FD 3 a été envoyé toutes les données de profilage entrelacées avec les données attendues.

SI VOUS NE L'AVEZ PAS OUVRIR, NE LE FERMEZ PAS.

+0

Eh bien, j'obtiens des descripteurs de socket via POSIX 'socket', et le seul endroit où le code appelle 'close' est le destructeur de wrapper. "Vous avez du code qui" aide "utilement à fermer les descripteurs de fichiers Unix de 3 à 1024" où puis-je le trouver? (J'ai déjà une idée, malade vérifier). –

+0

Comme je l'ai dit, c'était une supposition. Grep votre code pour "fermer". De telles boucles fermées sont souvent trouvées dans le backgrounder, daemonize, le double fork() code près du démarrage du service. –