Winsock - The buf parameter is not completely contained in a valid part of the user address space.15.12.01 23:18 Автор: делитант Статус: Незарегистрированный пользователь
получаю данные
int recv( SOCKET s, char FAR *buf, int len, int flags);
но возникает следуйщая ошибка
WSAEFAULT
The buf parameter is not completely contained in a valid part of the user address space.
что это значит???
часть кода
...
char *getbuf=new char[0x1000];
...
case FD_READ:
err=recv(newsock,getbuf,sizeof(getbuf),0);
if(err==SOCKET_ERROR)
{
switch(WSAGetLastError())
{
case WSANOTINITIALISED:
str="1";
break;
case WSAENETDOWN:
str="2";
break;
case WSAEFAULT: // ВОТ ОНА И ВОЗНИКАЕТ
str="3";
break;
...
если не сложно подскажите
Winsock - The buf parameter is not completely contained in a valid part of the user address space.17.12.01 00:59 Автор: kabanchik Статус: Незарегистрированный пользователь Отредактировано 17.12.01 01:00 Количество правок: 1
> получаю данные > int recv( SOCKET s, char FAR *buf, int len, int flags); > но возникает следуйщая ошибка > WSAEFAULT > The buf parameter is not completely contained in a valid > part of the user address space. > что это значит??? > часть кода
> ...
> char *getbuf=new char[0x1000];
> ...
> case FD_READ:
>
> err=recv(newsock,getbuf,sizeof(getbuf),0);
^^^^^^^^^^^^^^^^^^^ - tut u tebya vsegda vozvrashaet 4, t.e. sizeof(getbuf) == 4. VSEGDA !!!
poprobuj tak :
> err=recv(newsock, getbuf, 0x1000, 0);
> if(err==SOCKET_ERROR)
> {
> switch(WSAGetLastError())
> {
> case WSANOTINITIALISED:
> str="1";
> break;
> case WSAENETDOWN:
> str="2";
> break;
> case WSAEFAULT: // ВОТ ОНА
> И ВОЗНИКАЕТ
> str="3";
> break;
> ...
---
> если не сложно подскажите
к сожалению не помогает :(((17.12.01 08:45 Автор: делитант Статус: Незарегистрированный пользователь
Togda daj infu kakoj socket ty sozdaesh'? bolocking ili non-blocking socket?
potom sledi chtoby tvoj buffer by l valid.
ne mozhet byt' takogo chtoby kod nepravil'no rabotal. ishi bug v tvoem kode.
к сожалению не помогает :(((18.12.01 19:54 Автор: делитант Статус: Незарегистрированный пользователь
ОГРОМНО СПАСИБО!!!
У меня есть дополнительный вопросик
В чем моя ошибка ??? может это с моей стороны глупо звучит но я даже после того как ты указал мне на нее я не понимаю что тут такого. Конечно чисто интуитивно какие-то мысли по этому поводу у меня летают. но полет их так туманен и далек, что …
Что не верно ( как ошибку можно сформулировать)
char *sendbuf=new char[0x100];
char *getbuf=new char[0x1000];
…..
getbuf=sendbuf="";
…..
recv(newsock,getbuf,0x100,0);
…..
p.s. мне позор !!!!
> > Ваще лучше юзать не указатель на char а массив, > например: > > char buf[0x1000]; > > recv(sock, buf, sizeof(buf), 0); > > > > Работает в 100% случаях! > > I chto ty dlia odnogo bita, 0x1000 bite bydeliat` budesh ? > A esli dannyh bolshe chem 0x1000? Umnik e.p.r.s.t. ХаХаХа :)))
ну ты ламо!!
не знаешь - не 3.14зди!
Послушай лучше что знающие люди тебе говарят,
Если данные больше 0х1000, то если у тебя recv(socket, buf, sizeof(buf), 0), то придут данные исключительно размером sizeof(buf), остальные данные нужно получать ещо раз вызвав recv(socket, buf, sizeof(buf), 0)
А если данные меньше sizeof(buf), то полезно делать так:
int ret = recv(socket, buf, sizeof(buf), 0)
buf[ret] = 0;
Особенно если данные строковые
Удачи!!
Pampersy smeni, a to voniaet uzhe.24.12.01 22:21 Автор: + <Mikhail> Статус: Elderman
I voobche posmotri kak ty rabotaesh s "char*" ty ih putaesh veroiatno s CString (ili kakimo libo eche string obj), dlia raboty so stringami cheres char* ispolzui "C" String Manipulation function :
naprimer:
char string[80];
strcpy( string, "blah, blah blah!" );//scopirovali string
//ty zhe delal bot tak:
//string = "blah, blah blah!" ;
//chto ne est` verno, v dannom skuchee compiler zakrichit
//a esli zhe
//char* string = new char[80];
//togda ty perepishesh string pointer allocirovanniy by new operator na
//pointer ukazyvauchii na ->"blah, blah blah!"
> я понял что надо выкинуть > но почему что в ней такого что она глючит всю прогу > меня интерисует почему. я просто не аонимаю что в ней > такого Во-первых, сначала оба указателя указывали на буфер, теперь они указывают на константную строку ("" - это и есть указатель)
Во-вторых, похоже, что компилятор хранит указанную выше строку в другом сегменте , куда запись запрещена, поэтому и возникает такая ошибка
А вообще раз уж пишешь на C++, то используй нормальный класс для строк, а то char* - это такая гадость.
Все выше сказанное является 'IMHO'. Просьба близко к сердцу не принимать.