присвоить sockaddr другому изменяет адрес? - PullRequest
0 голосов
/ 27 августа 2010

При попытке следующего изменения адреса во втором sockaddr изменяется:

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

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

/*Stuff*/

Кто-нибудь знает почему? ...

РЕДАКТИРОВАТЬ: 1. Я изменил sockaddr на sockaddr_storageкоторый определенно имеет достаточно места для sockaddr_in !!2. Я инициализирую структуру на ноль при инициализации 3. Я написал копию ruitine для моих пожеланий по копированию / назначению:

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

Но это тоже не помогает! ...Я в отчаянии: (...

Ответы [ 3 ]

1 голос
/ 27 августа 2010

Как устанавливается fromlen при вызове recvfrom()?Если fromlen > sizeof(add1), возможно, вы пишете более add2.

Руководство Биджа предлагает использовать локальные переменные типа struct sockaddr_storage, которые гарантированно будут достаточно большимиудерживайте любой из struct sockaddr_foo s в использовании.

0 голосов
/ 27 августа 2010

Предполагая общий случай TCP - вы, вероятно, захотите использовать sockaddr_in, в котором есть место для дополнительных полей.

0 голосов
/ 27 августа 2010

Возможно, что вся структура не копируется.sa_data может быть длиннее 14 элементов.Но при выполнении копирования пропускаются биты после 14-го значения.

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

...