копирование sockaddr_storage в другой sockaddr_storage изменяет адрес

#c #copy #winsock #variable-assignment

#c #Копировать #winsock #присвоение переменной

Вопрос:

Привет… Как и в недавнем вопросе (никто не отреагировал на последние изменения) У меня проблема с назначением структуры sockaddr, заполненной recvfrom .

Как мне было рекомендовано, я изменил свой sockaddr на sockaddr_storage и привел его в действие в последний момент, чтобы убедиться, что для адреса достаточно места…

Но проблема

 sockaddr_storage s1, s2; 
/*recv address into s1*/ 
s2 = s1;
  

или memcpy(amp;s2, amp;s1, sizeof(sockaddr_storage));

Не работает … у кого-нибудь есть решение скопировать sockaddr_storage или, по крайней мере, адрес, чтобы сохранить его в структуре и получить исходное значение позже?…

Спасибо.

РЕДАКТИРОВАТЬ: определения для sockaddr и sockaddr_storage (msdn):

 struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};


typedef struct sockaddr_storage {
  short   ss_family;
  char    __ss_pad1[_SS_PAD1SIZE];
  __int64 __ss_align;
  char    __ss_pad2[_SS_PAD2SIZE];
} SOCKADDR_STORAGE, *PSOCKADDR_STORAGE;
  

Комментарии:

1. Для тех, кто не знает, можете ли вы предоставить определение структуры / класса sockaddr_storage?

2. Спасибо. Основываясь на определении, я ожидаю, что memcpy будет работать. Можете ли вы рассказать нам, почему, по вашему мнению, memcpy не сработал?

3. Я впервые заметил это, потому что клиент так и не получил ответа. Конечно, это могло быть связано с естественным поведением UDP, которое не является надежным протоколом. Но когда я использовал исходный адрес из recvfrom, это сработало… Итак, я установил некоторые точки останова и зачитал адрес вручную, и вуаля: адрес изменился после копирования…

Ответ №1:

Ваше копирование кажется правильным ( memcpy , по крайней мере). Я подозреваю, что вы неправильно анализируете результат. Вы можете попробовать использовать memcmp , чтобы убедиться, что копирование прошло успешно.