Он в 90% случаев равен NULL. Этот параметр определяет возможность наследования дескриптора другим процессом. если оперируем еще и с параметром lpSecurityDescriptor, то можно настроить еще и права доступа.
Еще вопрос по С. Можно ли как нибудь сделать так, чтобы цикл while выполнялся до тех пор, пока пользователь не нажмет ctrl+c? Если да, то как?
если это консольное приложение под windows то при нажатии Ctrl-C оно автоматически завершит свою работу. Перехватить нажатие Ctrl-C можно с помощью функции API SetConsoleCtrlHandler.
не помню можно ли для консольного а для оконного: user32.dll --> RegisterHotKey() Пример на C# , ...там ВинАпи , такчто понять не трудно ... http://forum.antichat.ru/showpost.php?p=588830&postcount=9
Данные с помощью ReadFile из бинарного файла,в цикле читаются в массив размером в 10мбайт.Вопрос вот в чем почему число которое возвращает sizeof(массив) не совпадаtn со значением которое возвращает ReadFile в lpNumberOfBytesRead ??
Т.е. ReadFile прочла меньше, чем должна была? Значит произошла к-либо ошибка. А сама функция что вернула (true/false)? Проверь с GetLastError что за ошибка возникла.
nNumberOfBytesToRead совпадает с возвращаемым значением в lpNumberOfBytesRead.А вот sizeof от буфера куда оно прочиталось возвращяет погоду на Марсе И GetLastError 0 возвращяет.
Это Дэнвер, погода летная, даю добро на старт. Вообще приводить надо бы весь код, от выделения памяти до GetLastError. А то мы тут все будем до второго пришествия гадать что это - нехватка озу, сбой в ос, неверное выделение памяти, кривая передача указателя функции чтения.
Code: 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;} } } }
дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
В общем ошибка такая: error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup когда убрал _t и оставил просто main, то ошибка исчезла. При компиляции ошибок небыло, а вот при дебаге или запуске... спс за помощь
Вот невезет ведь пытаюсь использовать вместо sizeof _msize и получаю Code: [Linker Error] Error: Unresolved external '__msize' referenced from C:\COD\CD\APP\UNIT1.OBJ
Зачем вообще тут sizeof? Я чего-то недопонимаю? Точное количество записанных в buf байт в переменной rb. Зачем извращать-то там, где не надо? Что мешает это значение использовать? Code: if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);break;} } strlen(buf) - тоже самое. Зачем, когда rb уже содержит нужное значение? Code: if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,rb,0);break;} } Да и потом strlen может херню вернуть ибо вы пишите http://www.cplusplus.com/reference/clibrary/cstring/strlen.html У тебя ноль где-нибудь в середине буфера будет и будет не айс ведь. половину только отошлешь
Да с отправкой я уже давно разобрался.Просто проблема с приемом ведь в последнем куске по любому прийдет не (1024*1024)*10 байт а меньше.Вот и надо как то определить сколько при приеме последнего куска в буфере оказывается.
2_nic http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx У тебя recv вернет количесво принятых байт.