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

📄 server.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 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 + -