2010-08-27 9 views
0

Tout en essayant la suite de l'adresse dans le deuxième changement de SOCKADDR:assigner sockaddr à un autre change l'addr?

/*Stuff*/ 
sockaddr add1, add2; 
recvfrom(/*socket*/, /*buffer*/, /*count*/, /*flag*/, &add1, /*fromlen*/); 

add2 = add1; //The sa_data - part changes O_o... 

/*Stuff*/ 

Tout le monde sait pourquoi ...

EDIT: 1.I a changé le sockaddr à sockaddr_storage qui a definetly assez d'espace pour sockaddr_in !! 2. Je Memset la structure à zéro lors de l'initialisation 3. J'ai écrit une copie ruitine pour ma copie/cession souhaite:

memcpy(&AddrTarget, &AddrSource, sizeof(sockaddr_storage)); 

Mais cela ne suffit pas, aussi ... Im désespérée :(! ...

Répondre

1

Comment fromlen est défini lorsque vous appelez recvfrom()? Si fromlen > sizeof(add1), vous écrivez probablement add2 par accident.

Beej's Guide suggère que vous utilisez des variables locales de type struct sockaddr_storage, qui est garanti d'être assez grand pour contenir l'un des struct sockaddr_foo s en cours d'utilisation.

+0

Je ne savais pas à ce sujet, très bien. –

+0

Oui ... J'ai utilisé ceci, mais: Cela ne fonctionne toujours pas ... ce que je fais est: SOCKADDR_STORAGE x, y; recvfrom (/ * recv addr dans x * /); y = x; << ---- change encore le contenu ... – Incubbus

0

Il est possible que l'ensemble struct n'est pas copié. sa_data peut être plus de 14 éléments. Mais faire une copie manque les bits après la valeur 14'th.

http://www.delorie.com/gnu/docs/glibc/libc_305.html

+0

Serait-ce une solution d'utiliser à la place la structure SOCKADDR_STORAGE et de la convertir, si nécessaire? ... – Incubbus

0

En supposant le cas courant de TCP - vous voulez probablement utiliser un sockaddr_in, qui a de l'espace pour les champs supplémentaires.

+0

'recvfrom' est généralement utilisé avec UDP. – dreamlax

Questions connexes