📄 client.asm
字号:
include .\head.inc
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
make_skt PROTO :dword
receive_pkt PROTO :dword,:dword
.const
IDD_CLIENT equ 106
IDC_LISTMEMBER equ 1001
IDC_LISTPRIVATE equ 1002
IDC_EDITURL equ 1004
IDC_BUTTONCONNECT equ 1005
IDC_EDITRECV equ 1006
IDC_EDITSEND equ 1007
IDC_BUTTONSEND equ 1008
IDC_EDITNICK equ 1009
UM_SOCK equ WM_USER+100h
UM_GETHOSTINFO equ WM_USER+101h
DEFAULT_PORT equ 5150
.data
TitleName db "客户端",0
StartupError db "套接字初始化错误!",0
SocketError db "套接字创建错误!",0
SelectError db "异步选择模式错误!",0
ConnectError db "连接服务器错误!",0
HostNameError db "输入的服务器域名错误!",0
Prompt db "域名和昵称必须填写完整,且昵称不超过3个汉字!",0
NickNameMark db "@#@",0
PrivateMark db "@$@",0
DeleteMark db "@!@",0
char db "%ld",0
HostBuffer db MAXGETHOSTSTRUCT dup (0)
ClearBuffer db 0,0
;DomainName db "www.asm.com",0
.data?
hInstance HINSTANCE ?
hsocket HANDLE ?
hConnect HANDLE ?
hSend HANDLE ?
hEdit HANDLE ?
hListMemb HANDLE ?
hListPriv HANDLE ?
hEvent HANDLE ?
RecvBuffer db 1024 dup (?)
SendBuffer db 1024 dup (?)
PrivBuffer db 100 dup (?)
DomainName db 100 dup (?)
buffer db 7 dup (?)
NickName db 15 dup (?)
hostnm hostent <>
DomainNum dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam,NULL,IDD_CLIENT,NULL,addr ModalDlgProc,NULL
invoke ExitProcess,eax
ModalDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
local hnewsocket:HANDLE
local wsaData:WSADATA
local index :dword
local nleft:dword
.if uMsg==WM_INITDIALOG
invoke CreateEvent,NULL,TRUE,FALSE,NULL
mov hEvent,eax
invoke GetDlgItem,hWnd,IDC_BUTTONCONNECT
mov hConnect,eax
invoke GetDlgItem,hWnd,IDC_BUTTONSEND
mov hSend,eax
invoke EnableWindow,hSend,FALSE
invoke GetDlgItem,hWnd,IDC_LISTMEMBER
mov hListMemb,eax
invoke GetDlgItem,hWnd,IDC_LISTPRIVATE
mov hListPriv,eax
invoke GetDlgItem,hWnd,IDC_EDITRECV
mov hEdit,eax
invoke WSAStartup,101h,addr wsaData
.if eax
invoke MessageBox,hWnd,addr StartupError,addr TitleName,MB_OK
invoke SendMessage,hWnd,WM_CLOSE,0,0
.endif
.elseif uMsg==WM_CLOSE
invoke WSACleanup
invoke EndDialog,hWnd,NULL
.elseif uMsg==UM_GETHOSTINFO
mov eax,lParam
shr eax,16
.if ax
invoke MessageBox,hWnd,addr HostNameError,addr TitleName,MB_OK
invoke SendMessage,hWnd,WM_CLOSE,0,0
.else
invoke make_skt,hWnd
invoke EnableWindow,hConnect,FALSE
.endif
.elseif uMsg==UM_SOCK
mov eax,lParam
.if ax==FD_READ
invoke receive_pkt,wParam,hWnd
.elseif ax==FD_WRITE
invoke SetEvent,hEvent
.elseif ax==FD_CONNECT
mov eax,lParam
shr eax,16
.if ax
invoke closesocket,hsocket
invoke MessageBox,hWnd,addr ConnectError,addr TitleName,MB_OK
invoke EnableWindow,hConnect,TRUE
invoke EnableWindow,hSend,FALSE
.else
invoke EnableWindow,hConnect,FALSE
invoke EnableWindow,hSend,TRUE
invoke lstrlen,addr NickName
invoke send,hsocket,addr NickName,eax,0
.endif
.elseif ax==FD_CLOSE
invoke closesocket,hsocket
invoke EnableWindow,hConnect,TRUE
invoke EnableWindow,hSend,FALSE
.endif
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if lParam
.if ax==IDC_BUTTONCONNECT
invoke GetDlgItemText,hWnd,IDC_EDITURL,addr DomainName,100
mov DomainNum,eax
invoke GetDlgItemText,hWnd,IDC_EDITNICK,addr NickName,100
.if !(eax && DomainNum) || eax>6
invoke MessageBox,hWnd,addr Prompt,addr TitleName,MB_OK
.else
invoke lstrcat,addr NickName,addr NickNameMark
invoke WSAAsyncGetHostByName,hWnd,UM_GETHOSTINFO,addr DomainName,addr HostBuffer,MAXGETHOSTSTRUCT
.endif
.elseif ax==IDC_BUTTONSEND
invoke RtlZeroMemory,addr PrivBuffer,100
invoke GetDlgItemText,hWnd,IDC_EDITSEND,addr SendBuffer,1024
.if eax
invoke SendMessage,hListPriv,LB_GETCOUNT,0,0
.if eax!=LB_ERR
mov index,0
.while index<eax
push eax
invoke SendMessage,hListPriv,LB_GETTEXT,index,addr buffer
invoke lstrcat, addr PrivBuffer,addr PrivateMark
invoke lstrcat, addr PrivBuffer,addr buffer
inc index
pop eax
.endw
.endif
invoke lstrcat,addr SendBuffer,addr PrivBuffer
invoke lstrlen,addr SendBuffer
mov nleft,eax
lea esi,SendBuffer
.while nleft>0
invoke send,hsocket,esi,nleft,0
.if eax==SOCKET_ERROR
invoke WSAGetLastError
.if eax!=WSAEWOULDBLOCK
invoke closesocket,hsocket
invoke MessageBox,hWnd,addr SendBuffer,addr TitleName,MB_OK
invoke SendMessage,hWnd,WM_CLOSE,0,0
.else
invoke WaitForSingleObject,hEvent,INFINITE
invoke ResetEvent,hEvent
.endif
.else
sub nleft,eax
add esi,eax
.endif
.endw
invoke SetDlgItemText,hWnd,IDC_EDITSEND,addr ClearBuffer
.endif
.elseif ax==IDC_LISTMEMBER
mov eax,wParam
shr eax,16
.if ax==LBN_DBLCLK
invoke SendMessage,hListMemb,LB_GETCURSEL,0,0
invoke SendMessage,hListMemb,LB_GETTEXT,eax,addr buffer
invoke SendMessage,hListPriv, LB_ADDSTRING,NULL,addr buffer
.endif
.elseif ax==IDC_LISTPRIVATE
mov eax,wParam
shr eax,16
.if ax==LBN_DBLCLK
invoke SendMessage,hListPriv,LB_GETCURSEL,0,0
invoke SendMessage,hListPriv,LB_DELETESTRING,eax,0
.endif
.endif
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
ModalDlgProc endp
make_skt proc uses esi edi hwnd:dword
local sin:sockaddr_in
invoke socket ,AF_INET,SOCK_STREAM,0
.if eax==INVALID_SOCKET
invoke MessageBox,hwnd,addr SocketError,addr TitleName,MB_OK
invoke SendMessage,hwnd,WM_CLOSE,0,0
.endif
mov hsocket,eax
invoke WSAAsyncSelect,hsocket,hwnd,UM_SOCK,FD_CONNECT or FD_WRITE or FD_READ or FD_CLOSE
.if eax==SOCKET_ERROR
invoke WSAGetLastError
.if eax!=WSAEWOULDBLOCK
invoke closesocket,hsocket
invoke MessageBox,hwnd,addr SelectError,addr TitleName,MB_OK
invoke SendMessage,hwnd,WM_CLOSE,0,0
.endif
.endif
invoke htons, DEFAULT_PORT
mov sin.sin_port,ax
mov sin.sin_family,AF_INET
lea edi,HostBuffer
assume edi:ptr hostent
mov esi,[edi].h_list
mov eax,[esi]
mov esi,[eax]
assume edi:nothing
mov sin.sin_addr,esi
invoke connect,hsocket,addr sin,sizeof sin
ret
make_skt endp
receive_pkt proc uses esi edi hs:dword,hwnd:HANDLE
invoke RtlZeroMemory,addr RecvBuffer,1024
invoke recv ,hs,addr RecvBuffer,1024,0
invoke InString ,1,addr RecvBuffer,addr NickNameMark
.if eax
invoke lstrlen,addr RecvBuffer
sub eax,3
lea esi,RecvBuffer
add esi,eax
mov byte ptr [esi],0
invoke SendMessage,hListMemb,LB_ADDSTRING,NULL,addr RecvBuffer
ret
.endif
invoke InString,1,addr RecvBuffer,addr DeleteMark
.if eax
invoke lstrlen,addr RecvBuffer
sub eax,3
lea esi,RecvBuffer
add esi,eax
mov byte ptr [esi],0
invoke SendMessage,hListMemb,LB_FINDSTRING,0,addr RecvBuffer
.if eax!=LB_ERR
invoke SendMessage,hListMemb,LB_DELETESTRING,eax,0
.endif
invoke SendMessage,hListPriv,LB_FINDSTRING,0,addr RecvBuffer
.if eax!=LB_ERR
invoke SendMessage,hListPriv,LB_DELETESTRING,eax,0
.endif
ret
.endif
invoke SendMessage,hEdit,EM_SETSEL,-1,-1
invoke SendMessage,hEdit,EM_REPLACESEL,0,addr RecvBuffer
ret
receive_pkt endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -