WinSock网络编程经络 Finger 客户端程序.docx

上传人:b****6 文档编号:13564868 上传时间:2023-06-15 格式:DOCX 页数:17 大小:18.31KB
下载 相关 举报
WinSock网络编程经络 Finger 客户端程序.docx_第1页
第1页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第2页
第2页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第3页
第3页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第4页
第4页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第5页
第5页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第6页
第6页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第7页
第7页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第8页
第8页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第9页
第9页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第10页
第10页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第11页
第11页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第12页
第12页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第13页
第13页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第14页
第14页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第15页
第15页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第16页
第16页 / 共17页
WinSock网络编程经络 Finger 客户端程序.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

WinSock网络编程经络 Finger 客户端程序.docx

《WinSock网络编程经络 Finger 客户端程序.docx》由会员分享,可在线阅读,更多相关《WinSock网络编程经络 Finger 客户端程序.docx(17页珍藏版)》请在冰点文库上搜索。

WinSock网络编程经络 Finger 客户端程序.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2