Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
WSAAsyncSelect 23.12.01 10:19
Автор: делитант Статус: Незарегистрированный пользователь
|
Не работает :((( !!! хотя чему тут не работать ???
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#define WM_SELECT WM_USER+1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
MSG msg;
HWND hWnd;
WSADATA ws;
SOCKET s;
sockaddr_in addr, newaddr;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wndclass ;
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = "name" ;
if(!RegisterClass(&wndclass)) return 0;
hWnd=CreateWindow("name",NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,hInstance,NULL);
//------------------------------------------------------------------------------//
if(WSAStartup(0x101,&ws)!=0)
return 0;
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
return 0;
addr.sin_family=AF_INET;
addr.sin_port=htons(80);
addr.sin_addr.s_addr=INADDR_ANY;
if(bind(s,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
return 0;
if(listen(s,1)==SOCKET_ERROR)
return 0;
if(WSAAsyncSelect(s,hWnd,WM_SELECT,FD_ACCEPT|FD_READ|FD_CLOSE)==SOCKET_ERROR)
return 0;
//------------------------------------------------------------------------------//
while(GetMessage(&msg,NULL,0,0)) { }
return msg.wParam;
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_SELECT:
MessageBox(0,"select",0,0);
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
MessageBox(0,"accept",0,0);
break;
case FD_READ:
MessageBox(0,"read",0,0);
break;
case FD_CLOSE:
break;
}
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
break;
}
return 0;
}
|
 |
WSAAsyncSelect 23.12.01 13:20
Автор: ih8u <i hate you> Статус: Member
|
Попробуй так:
int SockMsg;
SockMsg = RegisterWindowMessage("Socket Message");
ON_REGISTERED_MESSAGE(SockMsg, OnSockMsg)
SOCKET s;
s = socket(AF_INET, SOCK_STREAM, 0);
int iVal = 0;
int ret;
ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&iVal, sizeof (iVal));
if(ret == SOCKET_ERROR)
return 0;
WSAAsyncSelect(s, m_hWnd, SockMsg, FD_READ | FD_WRITE | FD_CONNECT);
LONG OnSockMsg(SOCKET s, LONG loEvent)
{
WORD wError;
WORD wEvent;
int ret;
wError = WSAGETSELECTERROR(loEvent);
wEvent = WSAGETSELECTEVENT(loEvent);
ret = 0;
switch(wEvent)
{
case FD_CONNECT:
{
if(!wError)
{
return 0; //Connect established
}
else
return 0;//Connection not established
break;
}
case FD_READ:
{
//recv
break;
}
default:
{
break;
}
}
return(0);
}
Так работает в диалоговом окне,
или ещо можно сделать вообще без окон, юзая не WSAAsyncSelect а WSAEventSelect
а потом с помощью WSANETWORKEVENTS делаешь так:
SOCKET s;
s = socket(...);
WSAEVENT hEvent;
hEvent = WSACreateEvent();
WSAEventSelect(s, hEvent, FD_READ | FD_WRITE | FD_CONNECT);
connect(....);
WSANETWORKEVENTS events;
while(1)
{
DWORD dw = WSAWaitForMultipleEvents(1, &hEvent, FALSE, 10000, FALSE);
if(dw == WSA_WAIT_TIMEOUT)
{//Timeout 10000}
WSAEnumNetworkEvents(s, hEvent, &events);
if(events.lNetworkEvents & FD_CONNECT)
{break;}
if(events.lNetworkEvents & FD_WRITE)
{break;}
if(events.lNetworkEvents & FD_READ)
{break;}
}
WSACloseEvent(hEvent);
Удачи!
|
|
|