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

📄 web.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
make_skt PROTO :dword
.const
IDD_SERVER              equ        102
IDC_EDIT                   equ        1000
DEFAULT_PORT        equ        80
UM_SOCK                   equ        WM_USER+100H
.data
TitleName             db "Web服务器端",0
StartupError         db "套接字初始化错误!",0
SocketError          db "套接字创建错误!",0
SelectError           db "异步选择模式错误!",0
BindError             db "绑定错误!",0
AcceptError          db "拒绝客户请求!",0
RequestError         db "不是GET请求!",13,10,0
PageError              db "无效网页!",13,10,0
Headers          db "HTTP/1.1 200 OK",13,10
                     db "Server:TCP/IP Test",13,10
                     db "Dat:Thu,20 April 2003 22:40:24 ",13,10
                     db "Content-Type:text/html",13,10
                     db "Accept-Ranges:bytes",13,10
                     db "Contest-Length:200",13,10
                     db 13,10,0;空行必需。
HEADLEN              equ $-Headers
DefaultFileName      db "default.htm",0
GetMark                 db "GET",0
DefaultPage            db "/ ",0
.data?
hInstance	     HINSTANCE ?
hsocket          HANDLE    ?
hEdit              HANDLE    ?
ThreadID        dd        ?
RecvBuffer      db 1024 dup (?)
DisplayBuffer   db 1200 dup (?)
request            db 100  dup(?)
actR_W          dd ?
.code
start:
   invoke GetModuleHandle, NULL
   mov hInstance,eax   
   invoke DialogBoxParam,NULL,IDD_SERVER,NULL,addr ModalDlgProc,NULL
   invoke ExitProcess,eax

ModalDlgProc proc  hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
   local hnewsocket:HANDLE
   .if  uMsg==WM_INITDIALOG
      invoke GetDlgItem,hWnd,IDC_EDIT      
      mov hEdit,eax
      invoke make_skt,hWnd
   .elseif uMsg==WM_CLOSE
      .if  hsocket
         invoke closesocket,hsocket
      .endif
      invoke WSACleanup
      invoke EndDialog,hWnd,NULL
   .elseif  uMsg==UM_SOCK
      mov eax,lParam
      .if  ax==FD_ACCEPT
         invoke accept,wParam,0,0
         mov hnewsocket,eax   
         mov esi,offset ServerThreadProc
         invoke CreateThread,NULL,NULL,esi,addr hnewsocket,0,addr ThreadID
         .if  eax==INVALID_SOCKET
            invoke closesocket,hsocket
            invoke MessageBox,hWnd,addr AcceptError,addr TitleName,MB_OK
            invoke SendMessage,hWnd,WM_CLOSE,0,0   
         .endif 
      .elseif  ax==FD_READ;不用

      .elseif  ax==FD_CLOSE;不用
      .endif
   .elseif  uMsg==WM_COMMAND     
      mov eax,wParam       
   .else
      mov eax,FALSE
      ret
   .endif
   mov eax,TRUE
   ret
ModalDlgProc endp

make_skt proc hwnd:dword
   local wsaData:WSADATA
   local sin:sockaddr_in
   invoke WSAStartup,101h,addr wsaData
   .if  eax
      invoke MessageBox,hwnd,addr StartupError,addr TitleName,MB_OK
      invoke SendMessage,hwnd,WM_CLOSE,0,0
   .endif
   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_ACCEPT 
   .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 RtlZeroMemory,addr sin,sizeof sin
   invoke htons, DEFAULT_PORT
   mov sin.sin_port,ax
   mov sin.sin_family,AF_INET
   mov sin.sin_addr.S_un,INADDR_ANY
   invoke bind,hsocket,addr sin,sizeof sockaddr_in
   .if  eax
      invoke closesocket,hsocket
      invoke MessageBox,hwnd,addr BindError,addr TitleName,MB_OK
      invoke SendMessage,hwnd,WM_CLOSE,0,0
   .endif
   invoke listen,hsocket,8
   ret
make_skt endp


ServerThreadProc proc   uses edi esi lpParam:dword
   local ofs:OFSTRUCT
   local hFile:HANDLE
   local temp:dword
   mov   temp,0
   mov DisplayBuffer,0
   mov actR_W,TRUE
   mov esi,lpParam
   invoke WSAAsyncSelect,[esi],NULL,NULL,FD_READ or FD_CLOSE;hwnd not useful
   invoke recv,[esi],addr RecvBuffer,1024,0
   invoke lstrcpyn,addr request,addr RecvBuffer,4
   invoke lstrcmpi,addr request,addr GetMark
   .if  eax
      invoke SendMessage,hEdit,EM_SETSEL,-1,-1
      invoke SendMessage,hEdit,EM_REPLACESEL,0,addr RequestError  
   .else
         invoke send,[esi],addr Headers,HEADLEN,0
         mov ofs.cBytes,sizeof ofs
         invoke OpenFile,addr DefaultFileName,addr ofs,OF_READ
         mov hFile,eax
         .while TRUE    
            invoke ReadFile,hFile,addr DisplayBuffer,1000,addr actR_W,NULL
               .if  eax &&actR_W==0
                  .break  
               .endif
            lea edi, DisplayBuffer
            add edi,actR_W
            mov byte ptr [edi],0
            invoke lstrlen,addr DisplayBuffer
            invoke send,[esi],addr DisplayBuffer,eax,0
         .endw    
   .endif
   invoke SendMessage,hEdit,EM_SETSEL,-1,-1
   invoke SendMessage,hEdit,EM_REPLACESEL,0,addr RecvBuffer    
  ; invoke closesocket,[esi]
   ret 
ServerThreadProc endp
end start


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -