- 注册时间
- 2005-4-19
- 最后登录
- 1970-1-1
|
发表于 2005-4-27 15:40:00
|
显示全部楼层
这里有个用win32ASM写的简单的聊天工具.
;************************************服务端代码**********************************
.386
.model flat,stdcall
option casemap:none
;*****************************************
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\ws2_32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib
;*************************************
IDD_DIALOG_UDP EQU 101
IDC_EDIT_ADDR EQU 1000
IDC_EDIT_SHOW EQU 1001
IDC_EDIT_SEND EQU 1002
WM_WINSOCK EQU WM_USER+1
UDP_PORT EQU 1234H
;*************************************
.DATA
dCount dd 0
MsgClient1 db "(Server)",0
MsgClient2 db "(Client)",0
.DATA?
hDlg dd ?
hEditSend dd ?
hIDOK dd ?
hEditShow dd ?
ipaddr dd ?
wsd WSADATA <>
sSockAddr sockaddr_in <>
cSockAddr sockaddr_in <>
IsConnect dd ?
hSocket dd ?
szBuffer db 32768 dup(?)
szReadBuffer db 32768 dup(?)
;*************************************
.CONST
szErr db "Error!",0
szFormat db "%s%s:%s",0dh,0ah,0
szAddr db " ",0
ErrSendMsg db "发送失败! ",0
szErrConnect db "尚未连接! ",0
;*************************************
.code
_initUDP proc
local _stSin:sockaddr_in
local _szBuffer[1024]:byte
mov IsConnect,0
invoke EnableWindow,IDOK,FALSE
invoke RtlZeroMemory,addr cSockAddr,sizeof cSockAddr
invoke WSAStartup,02h,addr wsd
invoke socket,AF_INET,SOCK_DGRAM,NULL
.IF eax==INVALID_SOCKET
invoke MessageBox,NULL,addr szErr,NULL,MB_OK
ret
.ENDIF
mov hSocket,eax
invoke WSAAsyncSelect,hSocket,hDlg,WM_WINSOCK,FD_READ
invoke RtlZeroMemory,addr _stSin,sizeof _stSin
invoke htons,UDP_PORT
mov _stSin.sin_port,ax
mov _stSin.sin_family,AF_INET
mov _stSin.sin_addr,INADDR_ANY
invoke bind,hSocket,addr _stSin,sizeof _stSin
.IF eax==SOCKET_ERROR
invoke MessageBox,NULL,addr szErr,addr szErr,MB_OK or MB_ICONWARNING
invoke SendMessage,hDlg,WM_CLOSE,0,0
.ENDIF
invoke gethostname,addr _szBuffer,sizeof _szBuffer
invoke gethostbyname,addr _szBuffer
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
invoke inet_ntoa,eax
invoke SetDlgItemText,hDlg,IDC_EDIT_ADDR,eax
ret
_initUDP endp
_RecvData proc _hSocket
local _dwStructLen
invoke RtlZeroMemory,addr szReadBuffer,sizeof szReadBuffer
invoke RtlZeroMemory,addr cSockAddr,sizeof cSockAddr
mov _dwStructLen,sizeof sockaddr_in
invoke recvfrom,_hSocket,addr szReadBuffer,sizeof szReadBuffer,0,addr cSockAddr,addr _dwStructLen
invoke WSAGetLastError
.IF eax!=SOCKET_ERROR
invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
lea esi,cSockAddr
assume esi TR sockaddr_in
mov eax,[esi].sin_addr
invoke inet_ntoa,eax
.IF eax
mov ipaddr,eax
invoke wsprintf,addr szBuffer,addr szFormat,ipaddr,addr MsgClient2,addr szReadBuffer
invoke GetWindowTextLength,hEditShow
invoke SendMessage,hEditShow,EM_SETSEL,eax,eax
invoke SendMessage,hEditShow,EM_REPLACESEL,FALSE,addr szBuffer
mov IsConnect,1
.ELSE
invoke MessageBox,NULL,addr szErr,NULL,MB_OK
mov IsConnect,0
.ENDIF
assume esi:nothing
.ENDIF
.IF IsConnect
invoke EnableWindow,IDOK,TRUE
.ELSE
invoke EnableWindow,IDOK,FALSE
.ENDIF
ret
_RecvData endp
;************************************************************
_SendData proc
local _szBuffer[1024]:byte
invoke RtlZeroMemory,addr szReadBuffer,sizeof szReadBuffer
invoke GetDlgItemText,hDlg,IDC_EDIT_SEND,addr szReadBuffer,sizeof szReadBuffer
invoke lstrlen,addr szReadBuffer
.IF eax
mov ecx,eax
invoke sendto,hSocket,addr szReadBuffer,ecx,0,addr cSockAddr,sizeof sockaddr_in
.IF eax==-1
mov IsConnect,0
invoke EnableWindow,IDOK,FALSE
invoke MessageBox,hDlg,addr ErrSendMsg,addr szErr,MB_OK or MB_ICONWARNING
.ENDIF
.ENDIF
invoke SetDlgItemText,hDlg,IDC_EDIT_SEND,NULL
invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
invoke gethostname,addr _szBuffer,sizeof _szBuffer
invoke gethostbyname,addr _szBuffer
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
invoke inet_ntoa,eax
.IF eax
invoke wsprintf,addr szBuffer,addr szFormat,eax,addr MsgClient1,addr szReadBuffer
invoke GetWindowTextLength,hEditShow
invoke SendMessage,hEditShow,EM_SETSEL,eax,eax
invoke SendMessage,hEditShow,EM_REPLACESEL,FALSE,addr szBuffer
.ELSE
invoke MessageBox,NULL,addr szErr,NULL,MB_OK
.endif
ret
_SendData endp
;*****************************************************************
_DlgProc proc hWnd,wMsg,wParam,lParam
mov eax,wMsg
.IF eax==WM_WINSOCK
mov eax,lParam
.IF ax==FD_READ
invoke _RecvData,wParam
.ELSE
invoke MessageBox,NULL,addr szErr,NULL,MB_OK
.ENDIF
.ELSEIF eax==WM_INITDIALOG
push hWnd
pop hDlg
invoke RegisterHotKey,hWnd,065h,MOD_CONTROL or MOD_ALT, 041h
invoke GetDlgItem,hDlg,IDC_EDIT_SHOW
mov hEditShow,eax
invoke GetDlgItem,hDlg,IDC_EDIT_SEND
mov hEditSend,eax
invoke SetDlgItemText,hDlg,IDC_EDIT_ADDR,addr szAddr
invoke _initUDP ;装入并初始化WINSOCK动态链接库
.elseif eax== WM_HOTKEY
invoke _SendData
invoke SetFocus,hEditSend
.ELSEIF eax==WM_CLOSE
invoke UnregisterHotKey,hWnd,065h
invoke closesocket,hSocket
invoke WSACleanup
invoke EndDialog,hDlg,NULL
.ELSEIF eax==WM_COMMAND
mov eax,wParam
.if ax==IDOK
.if IsConnect
invoke _SendData
invoke SetFocus,hEditSend
.else
invoke MessageBox,hDlg,addr szErrConnect,addr szErr,MB_OK or MB_ICONWARNING
.endif
.elseif ax==IDCANCEL
invoke SendMessage,hDlg,WM_CLOSE,0,0
.endif
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
_DlgProc endp
;****************************************************************
;****************************************************************
start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,IDD_DIALOG_UDP,NULL,addr _DlgProc,NULL
invoke ExitProcess,NULL
end start
;**************************资源文件***************************
#include "e:\masm32\include\resource.h"
#define IDD_DIALOG_UDP 101
#define IDC_EDIT_ADDR 1000
#define IDC_EDIT_SHOW 1001
#define IDC_EDIT_SEND 1002
IDD_DIALOG_UDP DIALOG DISCARDABLE 0,0,210,146
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
CAPTION "UDP Server--Made By Sxy"
FONT 10,"System"
BEGIN
DEFPUSHBUTTON "发送",IDOK,169,133,32,12
PUSHBUTTON "关闭",IDCANCEL,4,133,32,12
EDITTEXT IDC_EDIT_ADDR,70,10,135,12,ES_AUTOHSCROLL
LTEXT "本机IP地址",IDC_STATIC,6,12,62,9
GROUPBOX "网络操作",IDC_STATIC,2,2,207,24
EDITTEXT IDC_EDIT_SHOW,1,26,207,77,ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL|ES_READONLY
EDITTEXT IDC_EDIT_SEND,1,104,207,28,ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL
END
;***********************************************************************
|
|