HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 24.09.2008, 21:22
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 107


По умолчанию

Цитата:
Сообщение от 0x0c0de  
Т.е. ReadFile прочла меньше, чем должна была? Значит произошла к-либо ошибка. А сама функция что вернула (true/false)? Проверь с GetLastError что за ошибка возникла.
nNumberOfBytesToRead совпадает с возвращаемым значением в lpNumberOfBytesRead.А вот sizeof от буфера куда оно прочиталось возвращяет погоду на Марсе И
GetLastError 0 возвращяет.
 
Ответить с цитированием

  #2  
Старый 24.09.2008, 21:31
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами: 9981026

Репутация: 1564
По умолчанию

Цитата:
Сообщение от _nic  
nNumberOfBytesToRead совпадает с возвращаемым значением в lpNumberOfBytesRead.А вот sizeof от буфера куда оно прочиталось возвращяет погоду на Марсе И
GetLastError 0 возвращяет.
код в студию.
 
Ответить с цитированием

  #3  
Старый 24.09.2008, 21:40
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 107


По умолчанию

Цитата:
Сообщение от 0x0c0de  
код в студию.
Код:
char *fnam=new char[1024*10];
char *ip=new char[1024];
CRITICAL_SECTION cs;
void thr(void *Pvoid)
{
SOCKET s;SOCKADDR_IN adr;DWORD rb;unsigned long ss,sz;int p=1;
//WSADATA wsd;WSAStartup(MAKEWORD(1,1),&wsd);
adr.sin_family=AF_INET;
adr.sin_port=htons(3060);
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs);
adr.sin_addr.s_addr=inet_addr(ip);
LeaveCriticalSection(&cs);  
s=socket(AF_INET,SOCK_STREAM,0);
connect(s,(sockaddr*)&adr,sizeof(adr));SetLastError(0);
HANDLE f=CreateFile(fnam,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
char *buf=new char[(1024*1024)*10];
DWORD e=GetFileSize(f,&ss);
if(e>0){sz=e;}if(e<1){sz=ss;}
if(sz<(1024*1024)*10)
{ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);}
if(sz>(1024*1024)*10)
{
for(;;)
{
ReadFile(f,buf,(1024*1024)*10,&rb,0);
MessageBox(0,CurrToStr((int)rb).c_str(),"!!!",MB_OK);
MessageBox(0,CurrToStr((int)sizeof(buf)).c_str(),"!!!",MB_OK);
MessageBox(0,CurrToStr((int)GetLastError()).c_str(),"!!!",MB_OK);
sz=sz-(1024*1024)*10;send(s,buf,rb,0);
memset(buf,NULL,(1024*1024)*10);
SetFilePointer(f,((1024*1024)*10)*p,NULL,FILE_BEGIN);p++;
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);break;}
}
}
}
 
Ответить с цитированием

  #4  
Старый 24.09.2008, 21:34
neprovad
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
С нами: 9769287

Репутация: 711


По умолчанию

Цитата:
возвращяет погоду на Марсе
Это Дэнвер, погода летная, даю добро на старт.
Вообще приводить надо бы весь код, от выделения памяти до GetLastError. А то мы тут все будем до второго пришествия гадать что это - нехватка озу, сбой в ос, неверное выделение памяти, кривая передача указателя функции чтения.
 
Ответить с цитированием

  #5  
Старый 24.09.2008, 22:15
FrMn
Познающий
Регистрация: 08.08.2008
Сообщений: 55
С нами: 9346084

Репутация: 54
По умолчанию

дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
Цитата:
Example
Код:
// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>

size_t getPtrSize( char *ptr )
{
   return sizeof( ptr );
}

using namespace std;
int main()
{
   char szHello[] = "Hello, world!";

   cout  << "The size of a char is: "
         << sizeof( char )
         << "\nThe length of " << szHello << " is: "
         << sizeof szHello
         << "\nThe size of the pointer is "
         << getPtrSize( szHello ) << endl;
}
Output
The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4
 
Ответить с цитированием

  #6  
Старый 24.09.2008, 23:02
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 107


По умолчанию

Цитата:
Сообщение от FrMn  
дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
ну если sizeof() неподходит ,то что вместо него использовать?
 
Ответить с цитированием

  #7  
Старый 24.09.2008, 23:04
nerezus
Флудер
Регистрация: 12.08.2004
Сообщений: 3,791
С нами: 11444066

Репутация: 2290


По умолчанию

horlyk
#include "stdafx.h" убери и в настройках отключи.
 
Ответить с цитированием

  #8  
Старый 24.09.2008, 23:20
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 107


По умолчанию

Вот невезет ведь пытаюсь использовать вместо sizeof _msize и получаю
Код:
[Linker Error] Error: Unresolved external '__msize' referenced from C:\COD\CD\APP\UNIT1.OBJ
 
Ответить с цитированием

  #9  
Старый 24.09.2008, 23:20
horlyk
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
С нами: 9705420

Репутация: 21
По умолчанию

отключил еще при первой компиляции меня сразу выругало за stdafx.
спс
 
Ответить с цитированием

  #10  
Старый 25.09.2008, 06:44
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами: 9981026

Репутация: 1564
По умолчанию

Цитата:
Сообщение от _nic  
ну если sizeof() неподходит ,то что вместо него использовать?
Цитата:
char *buf=new char[(1024*1024)*10];

....
ReadFile(f,buf,sz,&rb,0)
....
MessageBox(0,CurrToStr((int)sizeof(buf)).c_str()," !!!",MB_OK);
Зачем вообще тут sizeof? Я чего-то недопонимаю? Точное количество записанных в buf байт в переменной rb. Зачем извращать-то там, где не надо? Что мешает это значение использовать?

Код:
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);break;}
}
strlen(buf) - тоже самое. Зачем, когда rb уже содержит нужное значение?

Код:
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,rb,0);break;}
}
Да и потом strlen может херню вернуть ибо вы пишите

Цитата:
Данные с помощью ReadFile из бинарного файла
http://www.cplusplus.com/reference/clibrary/cstring/strlen.html

Цитата:
The length of a C string is determined by the terminating null-character
....
У тебя ноль где-нибудь в середине буфера будет и будет не айс ведь. половину только отошлешь

Последний раз редактировалось 0x0c0de; 25.09.2008 в 07:08..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Внести депозит

Введите сумму USDT:

Принимается только USDT TRC20. Fake/Flash USDT не засчитывается.

×

Вывести депозит

Сумма USDT:

Ваш USDT TRC20 кошелек:

Заявка будет отправлена администратору.