📄 server.asm
字号:
;***********************************
;文件:Server.asm *
;功能:演示线程的使用的Socket编程 *
; ——服务器端 *
;***********************************
.386p
.model flat,stdcall
include win32.inc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn WSAStartup:proc
extrn htons:proc
extrn gethostbyname:proc
extrn getprotobyname:proc
extrn socket:proc
extrn connect:proc
extrn recv:proc
extrn closesocket:proc
extrn accept:proc
extrn _wsprintfA:proc
extrn send:proc
extrn bind:proc
extrn listen:proc
extrn CreateThread:proc
AF_INET = 2
PF_INET = AF_INET
SOCK_STREAM = 1
SOCK_DGRAM = 2
SOCK_RAW = 3
SOCK_RDM = 4
SOCK_SEQPACKET= 5
INADDR_ANY = 00000000H
INADDR_LOOPBACK = 7f000001H
INADDR_BROADCAST = 0ffffffffH
INADDR_NONE = 0ffffffffH
ADDR_ANY = INADDR_ANY
NULL = 0
MB_OK = 0
PORT = 1357
QLEN = 6
in_addr struc
s_addr dd ?
ends
hostent struc
h_name dd ?
h_aliases dd ?
h_addrtype dw ?
h_length dw ?
h_addr_list dd ?
;h_addr h_addr_list[0] /* address, for backward compat */
ends
protoent struc
p_name dd ?
p_aliases dd ?
p_proto dw ?
dw ?
ends
sockaddr_in struc
sin_family dw ?
sin_port dw ?
sin_addr dd ?
sin_zero db 8 dup (?)
ends
WSADESCRIPTION_LEN = 256
WSASYS_STATUS_LEN = 128
WSADATA struc
wVersion dw ?
wHighVersion dw ?
szDescription db WSADESCRIPTION_LEN+1 dup (0)
szSystemStatus db WSASYS_STATUS_LEN+1 dup (0)
iMaxSockets dw ?
iMaxUdpDg dw ?
lpVendorInfo dd ?
ends
.data
Caption db 'Server',0
Text db '服务器端——按"确定"退出',0
proto db 'tcp',0
host db 'localhost',0 ;20 dup (0)
strtmp db '第%d次连接',0
align 4
ptrp dd ?
alen dd ?
sd dd ?
port dd ?
visitors dd ?
ThreadID dd ?
align 4
sad sockaddr_in<>
align 4
cad sockaddr_in<>
align 4
wsaData WSADATA<>
.code
main:
call CreateThread,NULL,0,offset ThreadProc,0,0,offset ThreadID
;主线程按"确定"会退出
call MessageBoxA,0,offset Text,offset Caption,MB_OK
call closesocket,sd
call ExitProcess,0
ThreadProc:
call WSAStartup,0101H,offset wsaData ;为使用WS2_32.DLL初始化
mov sad.sin_family,AF_INET
mov sad.sin_addr,INADDR_ANY
mov port,PORT
mov eax,port
push eax
call htons ;主机字节顺到网络字节顺序转换
mov sad.sin_port,ax
call getprotobyname, offset proto ;映射协议名到协议号
mov ptrp,eax
movzx eax,[eax].p_proto
call socket,PF_INET,SOCK_STREAM,eax
mov sd,eax
call bind,sd,offset sad,size sad ;绑定
call listen,sd,QLEN ;监听
acceptnext:
mov alen,size cad
;接受连接
call accept,sd,offset cad,offset alen
;另开线程处理连接
call CreateThread,NULL,0,offset Service,eax,0,offset ThreadID
jmp acceptnext
Service proc sd2:DWORD
inc visitors ;访问数加1
sub esp,100
mov ebx,esp ;格式化字符串
call _wsprintfA,ebx,offset strtmp,visitors
add esp,3*4
call send,sd2,ebx,eax,0 ;发送
call closesocket,sd2 ;关闭
add esp,100
ret
Service endp
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -