📄 web.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 + -