#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
, чтобы убедиться, что копирование прошло успешно.