 |
|

24.09.2008, 21:40
|
|
Постоянный
Регистрация: 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;}
}
}
}
|
|
|

24.09.2008, 22:15
|
|
Познающий
Регистрация: 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
|
|
|

24.09.2008, 23:00
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
С нами:
9705420
Репутация:
21
|
|
Сообщение от 4p3
Код:
#include <iostream>
#include "stdafx.h"
using std::wcout;
int _tmain()
{
wchar_t *wcString = L"ненене";
setlocale(LC_ALL, "Russian");
wcout << L"дадада!" << L" " << wcString << std::endl;
_wsystem(L"pause");
return 0;
}
В общем ошибка такая:
error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
когда убрал _t и оставил просто main, то ошибка исчезла.
При компиляции ошибок небыло, а вот при дебаге или запуске...
спс за помощь 
|
|
|

24.09.2008, 23:02
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами:
10535289
Репутация:
107
|
|
Сообщение от FrMn
дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
ну если sizeof() неподходит ,то что вместо него использовать?
|
|
|

24.09.2008, 23:04
|
|
Флудер
Регистрация: 12.08.2004
Сообщений: 3,791
С нами:
11444066
Репутация:
2290
|
|
horlyk
#include "stdafx.h" убери и в настройках отключи.
|
|
|

24.09.2008, 23:20
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами:
10535289
Репутация:
107
|
|
Вот невезет ведь  пытаюсь использовать вместо sizeof _msize и получаю
Код:
[Linker Error] Error: Unresolved external '__msize' referenced from C:\COD\CD\APP\UNIT1.OBJ
|
|
|

24.09.2008, 23:20
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
С нами:
9705420
Репутация:
21
|
|
отключил еще при первой компиляции  меня сразу выругало за stdafx.
спс 
|
|
|

25.09.2008, 06:44
|
|
Постоянный
Регистрация: 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..
|
|
|

25.09.2008, 12:05
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами:
10535289
Репутация:
107
|
|
Да с отправкой я уже давно разобрался.Просто проблема с приемом ведь в последнем куске по любому прийдет не (1024*1024)*10 байт а меньше.Вот и надо как то определить сколько при приеме последнего куска в буфере оказывается. 
|
|
|

25.09.2008, 19:24
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами:
9981026
Репутация:
1564
|
|
2_nic
recv Function
...
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.
http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
У тебя recv вернет количесво принятых байт.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|