计算机网络实验指导书(详细版)

计算机网络实验指导书

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386 ;本程序使用386指令集 .model flat, stdcall ;本程序使用平坦内存模式,所有段共用1个4GB的空间

option casemap :none ;程序对变量名的字母大小写不敏感

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Include 数据

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc ;窗口库windows.dll,定义窗口操作函数 include user32.inc ;32位用户库user32.dll,定义用户接口函数 includelib user32.lib ;导入库user32.lib,定位user32.dll库函数 include kernel32.inc ;32位内核库kernel32.dll,定义系统核心资源管理函数

includelib kernel32.lib ;导入库kernel32.lib,定位kernel32.dll库函数 include wsock32.inc ;32位1.1版本的套接字库wsock32.dll,定义套接字函数

includelib wsock32.lib ;导入库wsock32.lib,定位wsock32.dll库函数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; equ 数据

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;对应的窗口资源 DLG_MAIN equ 2000 IDC_SERVER equ 2001 IDC_CONNECT equ 2002 IDC_INFO equ 2003 IDC_TEXT equ 2004

;通知消息使用的ID,必须选择大于WM_USER的值,本程序选择比WM_USER大100的值作为ID

WM_SOCKET equ WM_USER + 100 ;用于建立套接字的TCP端口号 TCP_PORT equ 9999

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

;窗口句柄及建立的套接字 hWinMain dd ?

第 46 页 共 64 页

计算机网络实验指导书

hSocket dd ?

;资源标签及ID对应的程序变量 hWinConnect dd ? hWinOK dd ? hWinText dd ? hWinServer dd ? hWinInfo dd ?

;recv原语收到的TCP数据包缓冲地址 szReadBuffer db 32768 dup (?) .const

;服务器IP输入前默认的初始值 szIP db '127.0.0.1',0

;连接或断开按钮的提示信息 szConnect db '连接(&C)',0 szDisConnect db '断开(&D)',0 ;出错弹出对话框时显示的信息 szErrIP db '无效的服务器IP地址!',0 szErrSocket db '创建Socket错误!',0 szErrConnect db '无法连接到服务器!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; TCP/IP 建立连接的用的线程

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;线程1:建立与服务器的连接

_Connect proc uses ebx esi edi _lParam

;局部变量,用于获得窗口中输入的服务器IP地址,为字符串格式 local @szBuffer[256]:byte ;局部变量,用于建立sockaddr_in结构体,把端口和IP组合,为建立套接字服务

local @stSin:sockaddr_in

;******************************************************************** ; 转换IP地址并建立socket

;******************************************************************** ;将结构体@stSin初始化,值清零

invoke RtlZeroMemory,addr @stSin,sizeof @stSin

;从窗口资源IDC_SERVER中获得字符串格式的服务器IP地址,存入@szBuffer invoke GetDlgItemText,hWinMain,IDC_SERVER,addr @szBuffer,sizeof

第 47 页 共 64 页

计算机网络实验指导书

@szBuffer

;将字符串格式的服务器IP地址转化为32位IP地址 invoke inet_addr,addr @szBuffer ;输入地址出错时的处理 .if eax == INADDR_NONE mov ebx,offset szErrIP ;显示出错信息“无效的服务器IP地址!” jmp _Error .endif ;组合IP地址和端口号,得到结构体@stSin mov @stSin.sin_addr,eax ;32位IP地址 mov @stSin.sin_family,AF_INET ;地址类型,WINDOWS必须为AF_INET invoke htons,TCP_PORT ;转换十进制的TCP端口号 mov @stSin.sin_port,ax ;TCP端口 ;根据结构体@stSin,建立套接字hSocket,类型为流套接字,协议类型为TCP invoke socket,AF_INET,SOCK_STREAM,0 .if eax == INVALID_SOCKET ;建立套接字失败时的处理过程 mov ebx,offset szErrSocket ;显示出错信息“创建Socket错误!” jmp _Error .endif mov hSocket,eax ;hSocket保存建立的套接字 ;******************************************************************** ; 连接到服务器

;******************************************************************** ;连接服务器的过程中,禁用连接按钮

invoke EnableWindow,hWinConnect,FALSE ;连接服务器的过程中,禁止输入服务器IP地址 invoke EnableWindow,hWinServer,FALSE ;设置套接字hSocket在窗口hWinMain的工作模式,明确使用的消息ID WM_SOCKET和响应的通知消息类型FD_CONNECT or FD_READ or FD_CLOSE or FD_WRITE

invoke WSAAsyncSelect,hSocket,hWinMain,WM_SOCKET,FD_CONNECT or FD_READ or FD_CLOSE or FD_WRITE ;客户端套接字hSocket与服务器@stSin建立连接

invoke connect,hSocket,addr @stSin,sizeof @stSin ;建立连接出错时的处理 .if eax == SOCKET_ERROR invoke WSAGetLastError ;获取出错码 .if eax != WSAEWOULDBLOCK ;连接已经完成则出错,否则不出错 call _DisConnect ;断开连接 mov ebx,offset szErrConnect ;显示出错信息“无法连接到服务器!”

jmp _Error .endif .endif

第 48 页 共 64 页

计算机网络实验指导书

Ret

;公共出错处理程序段 _Error: ;弹出“错误”对话框,显示地址ebx对应的提示信息串,按“确定”退出 invoke MessageBox,hWinMain,ebx,NULL,MB_OK or MB_ICONWARNING ret _Connect endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 断开连接

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;线程2:断开与服务器的连接 _DisConnect proc ;关闭当前建立的套接字hSocket,并将其值清零 invoke closesocket,hSocket mov hSocket,0 ;将hWinConnect按钮的提示信息由“断开(D)”转换为“连接(C)” invoke SetWindowText,hWinConnect,addr szConnect ;允许用户输入服务器IP地址并连接 invoke EnableWindow,hWinServer,TRUE invoke EnableWindow,hWinConnect,TRUE ;禁止用户输入信息并发送 invoke EnableWindow,hWinText,FALSE invoke EnableWindow,hWinOK,FALSE ret

_DisConnect endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 接收TCP数据包

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;线程3:接收并显示TCP数据包 _RecvData proc _hSocket ;接收缓冲区szReadBuffer清零 invoke RtlZeroMemory,addr szReadBuffer,sizeof szReadBuffer ;接收TCP数据包,存入szReadBuffer invoke recv,_hSocket,addr szReadBuffer,sizeof szReadBuffer,NULL ;正常接收的处理 .if eax != SOCKET_ERROR ;获取信息显示窗口的长度 invoke GetWindowTextLength,hWinInfo ;添加空行 invoke SendMessage,hWinInfo,EM_SETSEL,eax,eax

第 49 页 共 64 页

计算机网络实验指导书

;插入新接收到的信息 invoke SendMessage,hWinInfo,EM_REPLACESEL,FALSE,addr szReadBuffer

.endif ret

_RecvData endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 发送输入的文字

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;线程4:发送输入的文字 _SendData proc ;局部变量,存储输入的文字信息 local @szBuffer[1024]:byte ;从窗口标签IDC_TEXT中获取输入的文字信息,存入@szBuffer中 invoke GetDlgItemText,hWinMain,IDC_TEXT,addr @szBuffer,sizeof @szBuffer

;计算输入文字信息的长度,保存在eax寄存器中 invoke lstrlen,addr @szBuffer ;有输入文字信息则发送 .if eax ;将地址@szBuffer中长度为eax的文字信息发送给服务器 invoke send,hSocket,addr @szBuffer,eax,0 .if eax == SOCKET_ERROR ;获取出错码 invoke WSAGetLastError .if eax == WSAEWOULDBLOCK ;发送未成功前禁止点击发送按钮 invoke EnableWindow,hWinOK,FALSE .endif .endif .endif ;发送成功,清空文字输入框,等待下一次输入 invoke SetDlgItemText,hWinMain,IDC_TEXT,NULL ret

_SendData endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 主窗口程序

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;主窗口程序

;窗口句柄hWnd,消息类型wMsg,参数类型wParam,参数值lParam

第 50 页 共 64 页

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4