Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Winsock. Проблема передачи значания переменной DWORD

9.8K
16 февраля 2008 года
eng
22 / / 02.10.2005
У меня клиент-серверное приложение передачи файлов по сети. Файл передается от сервера к клиенту. Перед передачей самого файла сервер отправляет его размер в переменной DWORD следующим образом:
 
Код:
DWORD dwSizeFile=GetFileSize(hFile,NULL);//определяем размер файла
send(Sock,(char*)&dwSizeFile,4,0);//отправляем размер файла

А клиент получает эти данные вот так:
 
Код:
char sSizeFile[4];
recv(Sock,sSizeFile,4,0);
DWORD dwSizeFile=(DWORD)*sSizeFile;

И если размер файла равен 5, то все работает нормально, клиент получает число dwSizeFile=5. А вот если передается число 45056, то клиент получает dwSizeFile=0, а если смотреть по-байтово переменную sSizeFile, то получаем:
 
Код:
dwSizeFile[0]=0
dwSizeFile[1]=-80'°'
dwSizeFile[2]=0
dwSizeFile[3]=0

Может я что-то делаю не правильно?
354
16 февраля 2008 года
ШпиЁн
468 / / 19.02.2006
можно разложить DWORD на 4 составляющих байта, передать их по сети, а на "другой стороне" сложить эти байты обратно в DWORD.
передача:
 
Код:
unsigned char Value[4];
DWORD dwValueTr = 45056;
Value[0] = dwValueTr & 0xff;
Value[1] = dwValueTr >> 8 & 0xff;
Value[2] = dwValueTr >> 16 & 0xff;
Value[3] = dwValueTr >> 24 & 0xff;
send(Sock, (char*)Value, 4, 0);

прием:
 
Код:
unsigned char Value[4];
recv(Sock, (char*)Value, 4, 0);
DWORD dwValueRc = Value[3] << 24 | Value[2] << 16 | Value[1] << 8 | Value[0];
9.8K
16 февраля 2008 года
eng
22 / / 02.10.2005
а что делают операторы >> и << ?
87
16 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: eng
а что делают операторы >> и << ?



Это побитовый сдвиг вправо и влево. ШпиЁн видно не любит макросы типа LOWORD и т.п.

А с указателями вы хитро работаете. Только в конце какие-то глюки
DWORD dwSizeFile=(DWORD)*sSizeFile;
тут берётся char по указателю sSizeFile и приводится к типу DWORD. Конечно после этого старшие байты теряются. Не силен в указателях, но тут наверно надо что-то типа
DWORD dwSizeFile=(DWORD)*(DWORD *)sSizeFile;

А если не сработает, то тут надо смотреть в данные с указателями sSizeFile, sSizeFile+1, sSizeFile+2, sSizeFile+3 и извращаться с ними как в примере Шпиёна.

9.8K
16 февраля 2008 года
eng
22 / / 02.10.2005
Я нашел решение! Так как мы отправляем значение переменной типа DWORD, то принятые данные должны помещать в переменную этого же типа DWORD. Т.е. в коде сервера остается все так же , а в коде клиента переменную char sSizeFile[4]; заменяем на DWORD *dwSizeFile и далее работем с ней.

 
Код:
DWORD *dwSizeFile=new DWORD;//char sSizeFile[4];
recv(Sock,(char*)dwSizeFile,4,0);
//DWORD dwSizeFile=(DWORD)*sSizeFile;
Я не знаю почему это работает, в отличии от предыдущей версии, но это работает. Я методом "тыка" до этого допер. Если кто-нить может объяснить сие явление, буду очень признателен!
87
16 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: eng
Я методом "тыка" до этого допер. Если кто-нить может объяснить сие явление, буду очень признателен!



Рекомендую откопать какой-нибудь учебник по Си и почитать про указатели и типы переменных. Тогда может разберётесь, что указатель на переменную в 1 байт не то же самое, что указатель на переменную в 4 байта.

До этого ничего объяснить невозможно.

9.8K
16 февраля 2008 года
eng
22 / / 02.10.2005
Я понял. Я брал из переменной только один байт и преобразовывал в DWORD. А надо было sSizeFile преобразовать в указатель на переменную типа DWORD и по этому указателю получить значение. Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог