内容发布更新时间 : 2024/12/27 0:01:34星期一 下面是文章的全部内容请认真阅读。
计算机网络实验指导书
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam ;局部变量,加载并初始化WinSock库时返回该库的有关信息@stWsa,以及为连接而创建的线程句柄@dw
local @stWsa:WSADATA,@dwThreadID mov eax,wMsg .if eax == WM_SOCKET
;******************************************************************** ; 处理 Socket 消息
;******************************************************************** mov eax,lParam .if ax == FD_READ ;套接字收到对端发送来的数据包,启动TCP数据包接收线程 invoke _RecvData,wParam .elseif ax == FD_WRITE ;缓冲区空,可以继续发送数据,激活发送按钮 invoke EnableWindow,hWinOK,TRUE .elseif ax == FD_CONNECT ;用套接字连接对方,系统返回连接消息 shr eax,16 .if ax == NULL ;连接成功 ;将hWinConnect按钮的提示信息由“连接(C)”转换为“断开(D)”
invoke SetWindowText,hWinConnect,addr szDisConnect ;激活“断开(D)”按钮 invoke EnableWindow,hWinConnect,TRUE ;禁止输入服务器IP地址 invoke EnableWindow,hWinServer,FALSE ;允许输入文字信息并发送 invoke EnableWindow,hWinText,TRUE invoke EnableWindow,hWinOK,TRUE ;光标置于文字输入框中,等待信息输入 invoke SetFocus,hWinText .else ;连接失败 ;断开连接 invoke _DisConnect ;弹出“错误”对话框,显示出错信息“无法连接到服务器!” invoke MessageBox,hWinMain,offset szErrConnect,NULL,\\ MB_OK or MB_ICONWARNING .endif .elseif ax == FD_CLOSE ;检测到套接字对应连接被关闭,断开与服务器的连接 call _DisConnect .endif
;********************************************************************
第 51 页 共 64 页
计算机网络实验指导书
; 处理窗口消息
;******************************************************************** .elseif eax == WM_COMMAND mov eax,wParam .if ax == IDOK ;按钮“发送(S)”被点击,启动发送数据线程 invoke _SendData .elseif ax == IDC_CONNECT ;按钮“连接(C)”或“断开(D)”被点击,启动相关线程 ;套接字hSocket非零,说明已经建立了连接,点击该按钮是要断开连接
.if hSocket invoke _DisConnect ;启动断开连接线程 ;套接字hSocket为零,说明未建立连接,点击该按钮是要建立连接 .else ;创建线程,句柄为@dwThreadID,对应子程序为_Connect invoke CreateThread,NULL,0,offset _Connect,NULL,\\ NULL,addr @dwThreadID ;连接完成后,关闭连接线程 invoke CloseHandle,eax .endif .endif
;******************************************************************** ; 处理 窗口关闭 消息
;******************************************************************** ;用户关闭连接 .elseif eax == WM_CLOSE ;断开连接 invoke _DisConnect ;卸载WinSock库 invoke WSACleanup ;关闭窗口hWinMain invoke EndDialog,hWinMain,NULL
;******************************************************************** ; 处理 窗口初始化 消息
;******************************************************************** ;窗口被激活时,马上要运行的窗口初始化程序 .elseif eax == WM_INITDIALOG ;hWnd和hWinMain保存窗口句柄 push hWnd pop hWinMain ;以下程序段是建立窗口资源标签元素与程序变量之间的联系,参见图4.6
invoke GetDlgItem,hWnd,IDC_SERVER
第 52 页 共 64 页
计算机网络实验指导书
mov hWinServer,eax invoke GetDlgItem,hWnd,IDOK mov hWinOK,eax invoke GetDlgItem,hWnd,IDC_TEXT mov hWinText,eax invoke GetDlgItem,hWnd,IDC_CONNECT mov hWinConnect,eax invoke GetDlgItem,hWnd,IDC_INFO mov hWinInfo,eax ;服务器IP地址默认值设置为szIP,即127.0.0.1 invoke SetWindowText,hWinServer,addr szIP ;加载并初始化WinSock库,版本号为1.1,返回信息在@stWsa中 invoke WSAStartup,101h,addr @stWsa
;******************************************************************** .else ;消息处理失败,返回 mov eax,FALSE ret .endif ;消息处理成功,返回 mov eax,TRUE ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start: ;创建进程,获得进程句柄eax
invoke GetModuleHandle,NULL
;激活资源文件定义的主窗口DLG_MAIN,执行主窗口程序_ProcDlgMain invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0 ;用户关闭主窗口,退出进程 invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
第 53 页 共 64 页
计算机网络实验指导书
附录4 聊天程序服务器端程序说明
一、 资源文件SERVER.RC说明
1、资源文件源程序
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;定义窗口图标
#define ICO_MAIN 1000 ;定义窗口资源
#define DLG_MAIN 2000 ;整个窗口资源的标签与ID定义 #define IDC_INFO 2001 ;客户信息显示主窗口定义 #define IDC_COUNT 2002 ;在线客户计数
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN icon \;图标外部对应的文件
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 94, 84, 245, 154 ;定义主窗口大小及属性,如:标题及属性等
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION \聊天-服务器端\FONT 9, \宋体\{
;定义客户端传送的所有信息窗口,允许显示多行且自动滚屏
EDITTEXT IDC_INFO, 4, 3, 237, 133, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP
;定义在线用户数量显示对象
LTEXT \当前连线客户端数量:\ LTEXT \}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2、资源文件定义的运行窗口及对应的程序变量
;该资源文件定义的服务器端运行窗口如图 4.7所示。
第 54 页 共 64 页
计算机网络实验指导书
图4.7 资源文件定义的程序运行窗口及控件
二、服务器端程序说明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Server.asm
; 使用 TCP 协议的聊天室例子程序 — 服务器端
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接: ; ml /c /coff Server.asm ; rc Server.rc
; Link /subsystem:windows Server.obj Server.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 .model flat, stdcall option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include include includelib
windows.inc user32.inc user32.lib
;窗口库
;32位用户库
第 55 页 共 64 页