#include <windows.h>
#include <iostream.h>
#define WM_SOCKET (WM_USER+20)
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
int main()
{
char szAppName[]="windows";
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = NULL ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName= szAppName ;
RegisterClass(&wndclass);
HWND hwnd = CreateWindow (szAppName,TEXT ("Button Look"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, NULL, NULL) ;
if(hwnd==NULL)
{
cout<<"hwnd is err"<<endl;
}
WORD wv=MAKEWORD(2,2);
WSADATA ws;
int err=WSAStartup(wv,&ws);
if(err==-1)
{
cout<<"wsastartup is err"<<endl;
return 0;
}
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN si;
si.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
si.sin_family=AF_INET;
si.sin_port=htons(4567);
if(bind(s,(SOCKADDR*)&si,sizeof(si))==-1)
{
cout<<"bind is err"<<endl;
return 0;
}
WSAAsyncSelect(s,hwnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);
listen(s,5);
BOOL bRet;
MSG msg;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
return 0;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
case WM_SOCKET:
{
SOCKET s=wparam;
if(WSAGETSELECTERROR(lparam))
{
closesocket(s);
return 0;
}
switch(WSAGETSELECTEVENT(lparam))
{
case FD_ACCEPT:
{
SOCKADDR_IN di;
int len=sizeof(di);
SOCKET ts=accept(s,(SOCKADDR*)&di,&len);
WSAAsyncSelect(ts,hwnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);
}
break;
case FD_READ:
{
char szChar[256];
int rzbuf=recv(s,szChar,256,0);
szChar[rzbuf]='\0';
cout<<szChar<<endl;
}
break;
case FD_WRITE:
{
}
break;
case FD_CLOSE:
{
closesocket(s);
}
break;
}
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wparam,lparam);
}
上面的int rzbuf=recv(s,szChar,256,0);这里面的套接字为什么是S,还不是accept出来的ts???
我这里没弄明白
ts已经传给WSAAsyncSelect函数了!SOCKET ts=accept(s,(SOCKADDR*)&di,&len);
WSAAsyncSelect(ts,hwnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);