⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 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 + -