Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | |
к сожалению не помогает :((( 18.12.01 21:29 Число просмотров: 1274
Автор: + <Mikhail> Статус: Elderman
|
> вот тут весь мой БРЕД !!! > > > > #include <windows.h> > #include <stdio.h> > #define WM_SELECT WM_USER+1 > > LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); > > bool ServerSock(); > > char *str=new char[0x100]; > char *sendbuf=new char[0x100]; > char *getbuf=new char[0x1000]; > char s[0x100]; > int len; > int err; > > MSG msg; > HWND hWnd; > RECT rect; > > SOCKET sock,newsock; > WSADATA ws; > sockaddr_in addr, newaddr; > > int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE > hPrevInstance,LPSTR lpCmdLine,int nCmdShow) > { > > WNDCLASS wndclass ; > > wndclass.style = CS_HREDRAW|CS_VREDRAW; > > wndclass.lpfnWndProc = WndProc; > wndclass.cbClsExtra = 0; > wndclass.cbWndExtra = 0; > wndclass.hInstance = hInstance; > wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION ) ; > wndclass.hCursor = LoadCursor (NULL, IDC_ARROW ) ; > wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW; > wndclass.lpszMenuName = NULL ; > wndclass.lpszClassName = "name" ; > > if(!RegisterClass(&wndclass)) > {MessageBox(NULL,"RegisterClass",NULL,NULL); return 0;} > > hWnd=CreateWindow("name","Win Socket > Async",WS_OVERLAPPEDWINDOW, > 10,10,350,250,NULL,NULL,hInstance,NULL); > > ShowWindow(hWnd,nCmdShow); > UpdateWindow(hWnd); > > ServerSock(); > > while(GetMessage(&msg,NULL,0,0)) > { > TranslateMessage(&msg); > DispatchMessage(&msg); > } > return msg.wParam; > return 0; > > } > LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM > wParam,LPARAM lParam) > { > PAINTSTRUCT ps; > HDC hdc; > int size; > > switch(msg) > { > case WM_CREATE: > len=err=0; *************Bot ona, cheremuha****************** > getbuf=sendbuf=""; *********************************************************
> str="Server sleep"; > break; > case WM_PAINT: > hdc = BeginPaint(hWnd, &ps); > > GetClientRect(hWnd,&rect); > len=0; > while(str[len]!='\0') > len++; > TextOut(hdc,10,10,str,len); > len=0; > while(getbuf[len]!='\0') > len++; > TextOut(hdc,10,30,getbuf,len); > > EndPaint(hWnd, &ps); > break; > case WM_DESTROY: > shutdown(sock,1); > closesocket(sock); > WSACleanup(); > PostQuitMessage(0); > return 1; > break; > case WM_SELECT: > switch(WSAGETSELECTEVENT(lParam)) > { > case FD_ACCEPT: > str="CLIENT CONNECT"; > InvalidateRect(hWnd,&rect,1); > size =sizeof(newaddr); > > newsock=accept(sock,(sockaddr*)&newaddr,&size); > if(newsock==INVALID_SOCKET) > { > str="invalid client > socket"; > > InvalidateRect(hWnd,&rect,1); > shutdown(newsock,1); > closesocket(newsock); > } > break; > case FD_READ: > err=recv(newsock,getbuf,0x100,0); > if(err==SOCKET_ERROR) > { > str="bad recv"; > switch(WSAGetLastError()) > { > case WSANOTINITIALISED: > str="1"; > break; > case WSAENETDOWN: > str="2"; > break; > case WSAEFAULT: > str="3"; > break; > case WSAENOTCONN: > str="4"; > break; > case WSAEINTR: > str="5"; > break; > case WSAEINPROGRESS: > str="6"; > break; > case WSAENETRESET: > str="7"; > break; > case WSAENOTSOCK: > str="8"; > break; > case WSAEOPNOTSUPP: > str="9"; > break; > case WSAESHUTDOWN: > str="10"; > break; > case WSAEWOULDBLOCK: > str="11"; > break; > case WSAEMSGSIZE: > str="12"; > break; > case WSAEINVAL: > str="13"; > break; > case WSAECONNABORTED: > str="14"; > break; > case WSAETIMEDOUT: > str="15"; > break; > case WSAECONNRESET: > str="16"; > break; > } > } > else > { > getbuf[err]='\0'; > > MessageBox(NULL,getbuf,NULL,NULL); > } > InvalidateRect(hWnd,&rect,1); > break; > case FD_WRITE: > // InvalidateRect(hWnd,&rect,1); > // MessageBox(NULL,getbuf,NULL,NULL); > break; > } > break; > default: > return > DefWindowProc(hWnd,msg,wParam,lParam); > break; > } > return 0; > } > bool ServerSock() > { > if(WSAStartup(0x101,&ws)) > {str="WSAStartup > Error";InvalidateRect(hWnd,&rect,1);return 0;} > > sock=socket(AF_INET,SOCK_STREAM,0); > addr.sin_addr.s_addr=INADDR_ANY; > addr.sin_family=AF_INET; > addr.sin_port=htons(80); > > if(bind(sock,(sockaddr*)&addr,sizeof(addr))) > {str="this port is used"; > InvalidateRect(hWnd,&rect,1); return 0;} > > if(listen(sock,5)) > {str="listen Error"; > InvalidateRect(hWnd,&rect,1);return 0;} > > WSAAsyncSelect(sock,hWnd,WM_SELECT,FD_ACCEPT|FD_READ|FD_CLO > SE); > > str="soket init !!!"; > InvalidateRect(hWnd,&rect,1); > > return 1; > > }
|
<programming>
|
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
|
sledi za "^^^^"
> получаю данные > 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
Автор: делитант Статус: Незарегистрированный пользователь
|
|
| | |
к сожалению не помогает :((( 18.12.01 17:53
Автор: kabanchik Статус: Незарегистрированный пользователь
|
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
Автор: делитант Статус: Незарегистрированный пользователь
|
вот тут весь мой БРЕД !!!
#include <windows.h>
#include <stdio.h>
#define WM_SELECT WM_USER+1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
bool ServerSock();
char *str=new char[0x100];
char *sendbuf=new char[0x100];
char *getbuf=new char[0x1000];
char s[0x100];
int len;
int err;
MSG msg;
HWND hWnd;
RECT rect;
SOCKET sock,newsock;
WSADATA ws;
sockaddr_in addr, newaddr;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION ) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW ) ;
wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = "name" ;
if(!RegisterClass(&wndclass)) {MessageBox(NULL,"RegisterClass",NULL,NULL); return 0;}
hWnd=CreateWindow("name","Win Socket Async",WS_OVERLAPPEDWINDOW,
10,10,350,250,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
ServerSock();
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
int size;
switch(msg)
{
case WM_CREATE:
len=err=0;
getbuf=sendbuf="";
str="Server sleep";
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd,&rect);
len=0;
while(str[len]!='\0')
len++;
TextOut(hdc,10,10,str,len);
len=0;
while(getbuf[len]!='\0')
len++;
TextOut(hdc,10,30,getbuf,len);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
shutdown(sock,1);
closesocket(sock);
WSACleanup();
PostQuitMessage(0);
return 1;
break;
case WM_SELECT:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
str="CLIENT CONNECT";
InvalidateRect(hWnd,&rect,1);
size =sizeof(newaddr);
newsock=accept(sock,(sockaddr*)&newaddr,&size);
if(newsock==INVALID_SOCKET)
{
str="invalid client socket";
InvalidateRect(hWnd,&rect,1);
shutdown(newsock,1);
closesocket(newsock);
}
break;
case FD_READ:
err=recv(newsock,getbuf,0x100,0);
if(err==SOCKET_ERROR)
{
str="bad recv";
switch(WSAGetLastError())
{
case WSANOTINITIALISED:
str="1";
break;
case WSAENETDOWN:
str="2";
break;
case WSAEFAULT:
str="3";
break;
case WSAENOTCONN:
str="4";
break;
case WSAEINTR:
str="5";
break;
case WSAEINPROGRESS:
str="6";
break;
case WSAENETRESET:
str="7";
break;
case WSAENOTSOCK:
str="8";
break;
case WSAEOPNOTSUPP:
str="9";
break;
case WSAESHUTDOWN:
str="10";
break;
case WSAEWOULDBLOCK:
str="11";
break;
case WSAEMSGSIZE:
str="12";
break;
case WSAEINVAL:
str="13";
break;
case WSAECONNABORTED:
str="14";
break;
case WSAETIMEDOUT:
str="15";
break;
case WSAECONNRESET:
str="16";
break;
}
}
else
{
getbuf[err]='\0';
MessageBox(NULL,getbuf,NULL,NULL);
}
InvalidateRect(hWnd,&rect,1);
break;
case FD_WRITE:
// InvalidateRect(hWnd,&rect,1);
// MessageBox(NULL,getbuf,NULL,NULL);
break;
}
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
break;
}
return 0;
}
bool ServerSock()
{
if(WSAStartup(0x101,&ws))
{str="WSAStartup Error";InvalidateRect(hWnd,&rect,1);return 0;}
sock=socket(AF_INET,SOCK_STREAM,0);
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_family=AF_INET;
addr.sin_port=htons(80);
if(bind(sock,(sockaddr*)&addr,sizeof(addr)))
{str="this port is used"; InvalidateRect(hWnd,&rect,1); return 0;}
if(listen(sock,5))
{str="listen Error"; InvalidateRect(hWnd,&rect,1);return 0;}
WSAAsyncSelect(sock,hWnd,WM_SELECT,FD_ACCEPT|FD_READ|FD_CLOSE);
str="soket init !!!";
InvalidateRect(hWnd,&rect,1);
return 1;
}
|
| | | | |
к сожалению не помогает :((( 18.12.01 21:29
Автор: + <Mikhail> Статус: Elderman
|
> вот тут весь мой БРЕД !!! > > > > #include <windows.h> > #include <stdio.h> > #define WM_SELECT WM_USER+1 > > LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); > > bool ServerSock(); > > char *str=new char[0x100]; > char *sendbuf=new char[0x100]; > char *getbuf=new char[0x1000]; > char s[0x100]; > int len; > int err; > > MSG msg; > HWND hWnd; > RECT rect; > > SOCKET sock,newsock; > WSADATA ws; > sockaddr_in addr, newaddr; > > int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE > hPrevInstance,LPSTR lpCmdLine,int nCmdShow) > { > > WNDCLASS wndclass ; > > wndclass.style = CS_HREDRAW|CS_VREDRAW; > > wndclass.lpfnWndProc = WndProc; > wndclass.cbClsExtra = 0; > wndclass.cbWndExtra = 0; > wndclass.hInstance = hInstance; > wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION ) ; > wndclass.hCursor = LoadCursor (NULL, IDC_ARROW ) ; > wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW; > wndclass.lpszMenuName = NULL ; > wndclass.lpszClassName = "name" ; > > if(!RegisterClass(&wndclass)) > {MessageBox(NULL,"RegisterClass",NULL,NULL); return 0;} > > hWnd=CreateWindow("name","Win Socket > Async",WS_OVERLAPPEDWINDOW, > 10,10,350,250,NULL,NULL,hInstance,NULL); > > ShowWindow(hWnd,nCmdShow); > UpdateWindow(hWnd); > > ServerSock(); > > while(GetMessage(&msg,NULL,0,0)) > { > TranslateMessage(&msg); > DispatchMessage(&msg); > } > return msg.wParam; > return 0; > > } > LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM > wParam,LPARAM lParam) > { > PAINTSTRUCT ps; > HDC hdc; > int size; > > switch(msg) > { > case WM_CREATE: > len=err=0; *************Bot ona, cheremuha****************** > getbuf=sendbuf=""; *********************************************************
> str="Server sleep"; > break; > case WM_PAINT: > hdc = BeginPaint(hWnd, &ps); > > GetClientRect(hWnd,&rect); > len=0; > while(str[len]!='\0') > len++; > TextOut(hdc,10,10,str,len); > len=0; > while(getbuf[len]!='\0') > len++; > TextOut(hdc,10,30,getbuf,len); > > EndPaint(hWnd, &ps); > break; > case WM_DESTROY: > shutdown(sock,1); > closesocket(sock); > WSACleanup(); > PostQuitMessage(0); > return 1; > break; > case WM_SELECT: > switch(WSAGETSELECTEVENT(lParam)) > { > case FD_ACCEPT: > str="CLIENT CONNECT"; > InvalidateRect(hWnd,&rect,1); > size =sizeof(newaddr); > > newsock=accept(sock,(sockaddr*)&newaddr,&size); > if(newsock==INVALID_SOCKET) > { > str="invalid client > socket"; > > InvalidateRect(hWnd,&rect,1); > shutdown(newsock,1); > closesocket(newsock); > } > break; > case FD_READ: > err=recv(newsock,getbuf,0x100,0); > if(err==SOCKET_ERROR) > { > str="bad recv"; > switch(WSAGetLastError()) > { > case WSANOTINITIALISED: > str="1"; > break; > case WSAENETDOWN: > str="2"; > break; > case WSAEFAULT: > str="3"; > break; > case WSAENOTCONN: > str="4"; > break; > case WSAEINTR: > str="5"; > break; > case WSAEINPROGRESS: > str="6"; > break; > case WSAENETRESET: > str="7"; > break; > case WSAENOTSOCK: > str="8"; > break; > case WSAEOPNOTSUPP: > str="9"; > break; > case WSAESHUTDOWN: > str="10"; > break; > case WSAEWOULDBLOCK: > str="11"; > break; > case WSAEMSGSIZE: > str="12"; > break; > case WSAEINVAL: > str="13"; > break; > case WSAECONNABORTED: > str="14"; > break; > case WSAETIMEDOUT: > str="15"; > break; > case WSAECONNRESET: > str="16"; > break; > } > } > else > { > getbuf[err]='\0'; > > MessageBox(NULL,getbuf,NULL,NULL); > } > InvalidateRect(hWnd,&rect,1); > break; > case FD_WRITE: > // InvalidateRect(hWnd,&rect,1); > // MessageBox(NULL,getbuf,NULL,NULL); > break; > } > break; > default: > return > DefWindowProc(hWnd,msg,wParam,lParam); > break; > } > return 0; > } > bool ServerSock() > { > if(WSAStartup(0x101,&ws)) > {str="WSAStartup > Error";InvalidateRect(hWnd,&rect,1);return 0;} > > sock=socket(AF_INET,SOCK_STREAM,0); > addr.sin_addr.s_addr=INADDR_ANY; > addr.sin_family=AF_INET; > addr.sin_port=htons(80); > > if(bind(sock,(sockaddr*)&addr,sizeof(addr))) > {str="this port is used"; > InvalidateRect(hWnd,&rect,1); return 0;} > > if(listen(sock,5)) > {str="listen Error"; > InvalidateRect(hWnd,&rect,1);return 0;} > > WSAAsyncSelect(sock,hWnd,WM_SELECT,FD_ACCEPT|FD_READ|FD_CLO > SE); > > str="soket init !!!"; > InvalidateRect(hWnd,&rect,1); > > return 1; > > }
|
| | | | | |
к сожалению не помогает :((( 19.12.01 00:34
Автор: делитант Статус: Незарегистрированный пользователь
|
ОГРОМНО СПАСИБО!!!
У меня есть дополнительный вопросик
В чем моя ошибка ??? может это с моей стороны глупо звучит но я даже после того как ты указал мне на нее я не понимаю что тут такого. Конечно чисто интуитивно какие-то мысли по этому поводу у меня летают. но полет их так туманен и далек, что …
Что не верно ( как ошибку можно сформулировать)
char *sendbuf=new char[0x100];
char *getbuf=new char[0x1000];
…..
getbuf=sendbuf="";
…..
recv(newsock,getbuf,0x100,0);
…..
p.s. мне позор !!!!
|
| | | | | | |
Vykin etu strochku. 19.12.01 02:50
Автор: + <Mikhail> Статус: Elderman
|
|
| | | | | | | |
Vykin etu strochku. 19.12.01 08:54
Автор: делитант Статус: Незарегистрированный пользователь
|
я понял что надо выкинуть
но почему что в ней такого что она глючит всю прогу
меня интерисует почему. я просто не аонимаю что в ней такого
|
| | | | | | | | |
Vykin etu strochku. 21.12.01 13:23
Автор: ih8u <i hate you> Статус: Member
|
Ваще лучше юзать не указатель на char а массив, например:
char buf[0x1000];
recv(sock, buf, sizeof(buf), 0);
Работает в 100% случаях!
|
| | | | | | | | | |
Vykin etu strochku. 21.12.01 21:46
Автор: + <Mikhail> Статус: Elderman
|
> Ваще лучше юзать не указатель на 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.
|
| | | | | | | | | | |
Vykin etu strochku. 23.12.01 12:54
Автор: ih8u <i hate you> Статус: Member
|
> > Ваще лучше юзать не указатель на 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
|
|
| | | | | | | | |
Vykin etu strochku. 19.12.01 22:51
Автор: + <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!"
|
| | | | | | | | |
Vykin etu strochku. 19.12.01 09:08
Автор: SEH Статус: Незарегистрированный пользователь
|
> я понял что надо выкинуть > но почему что в ней такого что она глючит всю прогу > меня интерисует почему. я просто не аонимаю что в ней > такого Во-первых, сначала оба указателя указывали на буфер, теперь они указывают на константную строку ("" - это и есть указатель)
Во-вторых, похоже, что компилятор хранит указанную выше строку в другом сегменте , куда запись запрещена, поэтому и возникает такая ошибка
А вообще раз уж пишешь на C++, то используй нормальный класс для строк, а то char* - это такая гадость.
Все выше сказанное является 'IMHO'. Просьба близко к сердцу не принимать.
|
|
|