WinSock网络编程经络 Finger 客户端程序.docx
《WinSock网络编程经络 Finger 客户端程序.docx》由会员分享,可在线阅读,更多相关《WinSock网络编程经络 Finger 客户端程序.docx(17页珍藏版)》请在冰点文库上搜索。
![WinSock网络编程经络 Finger 客户端程序.docx](https://file1.bingdoc.com/fileroot1/2023-6/15/26a27c03-9381-4ad9-a442-d92c50c01ce0/26a27c03-9381-4ad9-a442-d92c50c01ce01.gif)
WinSock网络编程经络Finger客户端程序
WinSock网络编程经络-Finger客户端程序
/*************************************************************************
*
*Copyright(c)2002-2005byZhangHuiyongAllRightsReserved
*
*FILENAME:
FingerClnt.c
*
*PURPOSE:
Finger客户端程序.
*
*AUTHOR:
张会勇
*
*BOOK:
<>
*
**************************************************************************/
#include
#include
#pragmacomment(lib,"ws2_32.lib")/*WinSock使用的库函数*/
#defineWM_GETHOST_NOTIFY(WM_USER+1)/*定义域名查询消息*/
#defineWM_SOCKET_NOTIFY(WM_USER+11)/*定义socket消息*/
#defineFINGER_DEF_PORT79/*侦听的端口*/
#defineFINGER_NAME_LEN256/*一般名字缓冲区长度*/
#defineFINGER_MAX_BUF1024/*最大的接收缓冲区*/
/*定义控件的风格*/
#defineSTATIC_STYLE(WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT)
#defineBUTTON_STYLE(WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON)
#defineEDIT_STYLE(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT)
#defineEDIT_STYLE_EXT(EDIT_STYLE|ES_MULTILINE|ES_READONLY|\
WS_HSCROLL|WS_VSCROLL)
/*控件的标识,是控件在数组中的下标*/
#defineID_EDIT_USER1/*用户*/
#defineID_EDIT_HOST3/*主机*/
#defineID_BTN_FINGER4/*查询按钮的ID*/
#defineID_EDIT_LOG5/*日志控件的标识*/
#defineTABLE_SIZE(a)(sizeofa/sizeofa[0])
/*控件的属性结构*/
structWidget
{
intiLeft;/*左上角的x坐标*/
intiTop;/*左上角的y坐标*/
intiWidth;/*宽度*/
intiHeigh;/*高度*/
intiStyle;/*控件的风格*/
TCHAR*szType;/*控件类型:
button,editetc.*/
TCHAR*szTitle;/*控件上显示的文字*/
};
structFinger
{
HWNDhWnd;/*窗口句柄*/
HANDLEhAsyncHost;/*域名查询句柄*/
SOCKEThSoc;/*socket句柄*/
charcHostEnt[MAXGETHOSTSTRUCT];/*域名查询缓冲区*/
charszUser[FINGER_NAME_LEN];/*用户名*/
charszHost[FINGER_NAME_LEN];/*主机*/
};
/*定义Finger程序使用的控件*/
staticstructWidgetFgrWgt[]=
{
/*用户名*/
{1,1,6,2,STATIC_STYLE,TEXT("static"),TEXT("用户:
")},
{7,1,24,2,EDIT_STYLE,TEXT("edit"),TEXT("Alice")},
/*主机*/
{33,1,6,2,STATIC_STYLE,TEXT("static"),TEXT("主机:
")},
{38,1,24,2,EDIT_STYLE,TEXT("edit"),TEXT("127.0.0.1")},
/*Finger按钮*/
{64,1,12,2,BUTTON_STYLE,TEXT("button"),TEXT("Finger")},
/*信息*/
{1,4,64,20,EDIT_STYLE_EXT,TEXT("edit"),TEXT("")}
};
/*定义全局变量*/
staticHWNDhWndWgt[TABLE_SIZE(FgrWgt)];
staticstructFingergFingerCtrl={0,0,INVALID_SOCKET};
staticLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
staticvoidLogPrintf(TCHAR*szFormat,...);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
{
TCHARszClassName[]=TEXT("FingerClnt");
MSGmsg;
WNDCLASSwndclass;
WSADATAwsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);/*初始化*/
/*注册窗口类*/
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)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;/*菜单*/
wndclass.lpszClassName=szClassName;/*窗口类名*/
if(!
RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("RequiresWindowsNT!
"),szClassName,0);
return0;
}
gFingerCtrl.hWnd=CreateWindow(szClassName,/*与注册类名相同*/
TEXT("FingerClient"),/*窗口标题*/
WS_OVERLAPPEDWINDOW,/*窗口风格*/
CW_USEDEFAULT,/*初始x坐标*/
CW_USEDEFAULT,/*初始y坐标*/
CW_USEDEFAULT,/*初始宽度*/
CW_USEDEFAULT,/*初始高度*/
NULL,/*父窗口句柄*/
NULL,/*菜单句柄*/
hInstance,/*程序实例句柄*/
NULL);/*程序参数*/
ShowWindow(gFingerCtrl.hWnd,iCmdShow);/*显示窗口*/
UpdateWindow(gFingerCtrl.hWnd);/*更新窗口*/
/*消息循环*/
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(gFingerCtrl.hSoc!
=INVALID_SOCKET)
closesocket(gFingerCtrl.hSoc);
WSACleanup();
returnmsg.wParam;
}
/**************************************************************************
*
*函数功能:
处理WM_CREATE消息.
*
*参数说明:
[IN]hWnd,窗口句柄.
*[IN]wParam,消息的WPARAM参数.
*[IN]lParam,消息的LPARAM参数.
*
*返回值:
void.
*
**************************************************************************/
staticvoidFingerOnCreate(HWNDhWnd,WPARAMwParam,LPARAMlParam)
{
HINSTANCEhInstance=((LPCREATESTRUCT)lParam)->hInstance;
inti,iCount=TABLE_SIZE(FgrWgt);
intcxChar,cyChar;
structWidget*pWgt;
cxChar=LOWORD(GetDialogBaseUnits());
cyChar=HIWORD(GetDialogBaseUnits());
/*创建控件*/
for(i=0;i{
pWgt=&FgrWgt[i];
hWndWgt[i]=CreateWindow(pWgt->szType,pWgt->szTitle,
pWgt->iStyle,pWgt->iLeft*cxChar,pWgt->iTop*cyChar,
pWgt->iWidth*cxChar,pWgt->iHeigh*cyChar,
hWnd,(HMENU)i,hInstance,NULL);
}
}
/**************************************************************************
*
*函数功能:
处理Finger程序的查询命令.
*
*参数说明:
[IN]hWnd,窗口句柄.
*[IN]wParam,单击消息的WPARAM参数.
*[IN]lParam,单击消息的LPARAM参数.
*
*返回值:
处理了命令返回TRUE,否则返回FALSE.
*
**************************************************************************/
staticBOOLFingerOnCommand(HWNDhWnd,WPARAMwParam,LPARAMlParam)
{
intwmId=LOWORD(wParam),wmEvent=HIWORD(wParam);
/*处理BN_CLICKED,得到用户输入的信息*/
if((wmId==ID_BTN_FINGER)&&(wmEvent==BN_CLICKED))
{
if(gFingerCtrl.hAsyncHost)
returnTRUE;
if(gFingerCtrl.hSoc!
=INVALID_SOCKET)
{
closesocket(gFingerCtrl.hSoc);
gFingerCtrl.hSoc=INVALID_SOCKET;
}
GetWindowText(hWndWgt[ID_EDIT_USER],gFingerCtrl.szUser,
FINGER_NAME_LEN);
GetWindowText(hWndWgt[ID_EDIT_HOST],gFingerCtrl.szHost,
FINGER_NAME_LEN);
gFingerCtrl.hAsyncHost=WSAAsyncGetHostByName(hWnd,
WM_GETHOST_NOTIFY,gFingerCtrl.szHost,
gFingerCtrl.cHostEnt,MAXGETHOSTSTRUCT);
if(gFingerCtrl.hAsyncHost==0)
MessageBox(hWnd,TEXT("GetHostError"),NULL,0);
returnTRUE;
}
returnFALSE;
}
/**************************************************************************
*
*函数功能:
创建客户端socket,与服务器建立连接.
*
*参数说明:
[IN]hWnd,窗口句柄.
*
*返回值:
成功返回创建的socket,失败返回INVALID_SOCKET.
*
**************************************************************************/
staticSOCKETFingerQuery(HWNDhWnd)
{
structsockaddr_insoc_addr;/*socket地址结构*/
SOCKETsoc;/*Finger的socket句柄*/
intresult;
unsignedlongaddr;
structhostent*host_ent;
host_ent=(structhostent*)gFingerCtrl.cHostEnt;
addr=*(unsignedlong*)host_ent->h_addr;/*网络字节序*/
soc=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
result=WSAAsyncSelect(soc,hWnd,WM_SOCKET_NOTIFY,
FD_CONNECT|FD_READ|FD_CLOSE);
/*连接的地址和端口*/
soc_addr.sin_family=AF_INET;
soc_addr.sin_port=htons(FINGER_DEF_PORT);
soc_addr.sin_addr.s_addr=addr;
/*与服务器建立连接*/
result=connect(soc,(structsockaddr*)&soc_addr,sizeof(soc_addr));
if((result==SOCKET_ERROR)&&
(WSAGetLastError()!
=WSAEWOULDBLOCK))
{
closesocket(soc);
MessageBox(hWnd,TEXT("Can'tconnectserver"),NULL,0);
returnINVALID_SOCKET;
}
returnsoc;
}
/**************************************************************************
*
*函数功能:
连接成功,向服务器发送查询.
*
*参数说明:
[IN]clnt_soc,与客户端连接的socket句柄.
*
*返回值:
成功返回发送的长度,失败返回错误码.
*
**************************************************************************/
staticintFingerOnConnect(SOCKETclnt_soc)
{
intresult;
charcSendBuf[FINGER_MAX_BUF];
result=sprintf(cSendBuf,"%s\r\n",gFingerCtrl.szUser);
result=send(clnt_soc,cSendBuf,result,0);
returnresult;
}
/**************************************************************************
*
*函数功能:
处理socket上的读事件通知.
*
*参数说明:
[IN]clnt_soc,socket句柄.
*
*返回值:
成功返回接收的数据长度,失败返回错误码.
*
**************************************************************************/
staticintFingerOnRead(SOCKETclnt_soc)
{
intresult,buflen=FINGER_MAX_BUF-1;
charcBuf[FINGER_MAX_BUF];
/*接收数据*/
result=recv(clnt_soc,cBuf,buflen,0);
if(result<=0)
{
closesocket(clnt_soc);/*最好加gFingerCtrl.hSoc=INVALID_SOCKET;*/
returnresult;
}
cBuf[result]=0;
LogPrintf(TEXT("%s\r\n"),cBuf);
returnresult;
}
/**************************************************************************
*
*函数功能:
socket事件处理.
*
*参数说明:
[IN]wParam,socket句柄.
*[IN]lParam,低16位是网络事件,高16位是错误码.
*
*返回值:
void.
*
**************************************************************************/
staticvoidFingerOnSocketNotify(WPARAMwParam,LPARAMlParam)
{
intiResult=0;
WORDwEvent,wError;
wEvent=WSAGETSELECTEVENT(lParam);/*LOWORD*/
wError=WSAGETSELECTERROR(lParam);/*HIWORD*/
switch(wEvent)
{
caseFD_CONNECT:
if(wError)
{
LogPrintf(TEXT("FD_CONNECTerror#%i"),wError);
return;
}
FingerOnConnect(wParam);
break;
caseFD_READ:
if(wError)
{
LogPrintf(TEXT("FD_READerror#%i"),wError);
return;
}
FingerOnRead(wParam);
break;
caseFD_CLOSE:
closesocket(wParam);
gFingerCtrl.hSoc=INVALID_SOCKET;
break;
}
}
staticLRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,
WPARAMwParam,LPARAMlParam)
{
intcyChar,cxClient,cyClient;
intiError;
structWidget*pWgt;
switch(message)
{
caseWM_CREATE:
FingerOnCreate(hWnd,wParam,lParam);
return0;
caseWM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
cyChar=HIWORD(GetDialogBaseUnits());
pWgt=&FgrWgt[ID_EDIT_LOG];
MoveWindow(hWndWgt[ID_EDIT_LOG],pWgt->iLeft,
pWgt->iTop*cyChar,cxClient,cyClient,FALSE);
return0;
caseWM_DESTROY:
PostQuitMessage(0);
return0;
caseWM_COMMAND:
if(FingerOnCommand(hWnd,wParam,lParam))
return0;
break;
caseWM_GETHOST_NOTIFY:
iError=WSAGETASYNCERROR(lParam);
if(iError||wParam!
=(WPARAM)gFingerCtrl.hAsyncHost)
{
gFingerCtrl.hAsyncHost=0;
MessageBox(hWn