📄 map.asm
字号:
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include wsock32.inc
includelib wsock32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WM_SOCKET equ WM_USER + 100
MAX_SOCKET equ 300 ;最大连接数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hWinMain dd ?
hSocket dd ?
dwsend db 2 dup(?)
szBuffer db 8192 dup (?)
stTable dd MAX_SOCKET*2 dup (?)
szgsip db 16 dup(?)
dwsign dd ?
szip db 16 dup(?)
stSin sockaddr_in <?>
.const
szErrBind db '无法绑定到TCP端口,请检查是否有其它程序在使用!',0
szsection db 'setup',0
szkey1 db 'lport',0
szkey2 db 'ip',0
szkey3 db 'port',0
szfilename db '.\server.ini',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在客户端列表中加上一个 socket
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AddClient proc _hSocket
mov dwsign,0
mov esi,offset stTable
.while dwsign < MAX_SOCKET*2
.if ! dword ptr [esi]
push _hSocket
pop [esi]
add dwsign,WM_SOCKET+1
invoke WSAAsyncSelect,_hSocket,hWinMain,dwsign,FD_READ or FD_CLOSE
invoke socket,AF_INET,SOCK_STREAM,0
mov dword ptr [esi+4],eax
inc dwsign
invoke WSAAsyncSelect,eax,hWinMain,dwsign,FD_READ or FD_CLOSE
invoke connect,[esi+4],addr stSin,sizeof stSin
ret
.endif
inc dwsign
add esi,4
.endw
invoke closesocket,_hSocket
ret
_AddClient endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 从客户端列表中去掉一个 socket
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RemoveClient proc _wMsg
mov esi,offset stTable
add esi,_wMsg
add esi,_wMsg
add esi,_wMsg
add esi,_wMsg
sub esi,(WM_SOCKET+1)*4
mov eax,_wMsg
and eax,1
jnz @F
invoke closesocket,[esi]
invoke closesocket,[esi-4]
mov dword ptr [esi-4],0
mov dword ptr [esi],0
ret
@@: invoke closesocket,[esi]
invoke closesocket,[esi+4]
mov dword ptr [esi],0
mov dword ptr [esi+4],0
ret
_RemoveClient endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 处理接收到的TCP包
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RecvData proc _wMsg,_hSocket
local @dwRecv
invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
invoke recv,_hSocket,addr szBuffer,sizeof szBuffer,NULL
mov @dwRecv,eax
mov esi,offset stTable
add esi,_wMsg
add esi,_wMsg
add esi,_wMsg
add esi,_wMsg
sub esi,(WM_SOCKET+1)*4
mov eax,_wMsg
and eax,1
jnz @F
invoke send,[esi-4],addr szBuffer,@dwRecv,0
ret
@@: invoke send,[esi+4],addr szBuffer,@dwRecv,0
ret
_RecvData endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 初始化 Socket,绑定到服务TCP端口并监听
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Init proc
local @stWsa:WSADATA
local @stSin:sockaddr_in
local @lport:DWORD
local @sport:DWORD
invoke GetDlgItemInt,hWinMain,1001,addr @lport,NULL
mov @lport,eax
invoke GetDlgItemInt,hWinMain,1003,addr @sport,NULL
mov @sport,eax
invoke GetDlgItemText,hWinMain,1002,offset szip,16
invoke WSAStartup,101h,addr @stWsa
invoke socket,AF_INET,SOCK_STREAM,0
mov hSocket,eax
invoke WSAAsyncSelect,hSocket,hWinMain,WM_SOCKET,FD_ACCEPT
invoke RtlZeroMemory,addr @stSin,sizeof @stSin
invoke htons,@lport
mov @stSin.sin_port,ax
mov @stSin.sin_family,AF_INET
mov @stSin.sin_addr,INADDR_ANY
invoke bind,hSocket,addr @stSin,sizeof @stSin
.if eax == SOCKET_ERROR
invoke MessageBox,hWinMain,addr szErrBind,NULL,\
MB_OK or MB_ICONWARNING
invoke SendMessage,hWinMain,WM_CLOSE,0,0
.else
invoke listen,hSocket,5
invoke inet_addr,addr szip
mov stSin.sin_addr,eax
mov stSin.sin_family,AF_INET
invoke htons,@sport
mov stSin.sin_port,ax
invoke GetDlgItem,hWinMain,1000
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,1001
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,1002
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,1003
invoke EnableWindow,eax,FALSE
.endif
ret
_Init endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax>WM_SOCKET && eax<WM_SOCKET+MAX_SOCKET*2+1
mov eax,lParam
.if ax == FD_READ
invoke _RecvData,wMsg,wParam
.elseif ax == FD_CLOSE
invoke _RemoveClient,wMsg
.endif
.elseif eax == WM_SOCKET
mov eax,lParam
.if ax == FD_ACCEPT
invoke accept,wParam,0,0
invoke _AddClient,eax
.endif
;********************************************************************
; 退出时关闭全部连接
;********************************************************************
.elseif eax == WM_CLOSE
invoke closesocket,hSocket
xor ebx,ebx
mov esi,offset stTable
cld
.while ebx < MAX_SOCKET*2
lodsd
.if eax
invoke closesocket,eax
.endif
inc ebx
.endw
invoke WSACleanup
invoke EndDialog,hWinMain,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
mov esi,offset dwsend
mov byte ptr [esi],0C3h ;在每个数据包前加个头
mov byte ptr [esi+1],22h
invoke GetPrivateProfileInt,offset szsection,offset szkey1,0,offset szfilename
invoke SetDlgItemInt,hWinMain,1001,eax,NULL
invoke GetPrivateProfileInt,offset szsection,offset szkey3,0,offset szfilename
invoke SetDlgItemInt,hWinMain,1003,eax,NULL
invoke GetPrivateProfileString,offset szsection,offset szkey2,0,offset szgsip,16,offset szfilename
invoke SetDlgItemText,hWinMain,1002,offset szgsip
;**********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax==1000
call _Init
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,101,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -