WIN32汇编语言教程:第16章 TCP/IP和网络通信 · 16.3 TCP协议编程(2)

客户端的汇编源代码Client.asm文件的内容如下:

                 .386

                  .model flat, stdcall

                 option casemap :none  ; case sensitive

;####################################################################

;  Include 数据

;####################################################################

include       windows.inc

include       user32.inc

includelib    user32.lib

include       kernel32.inc

includelib    kernel32.lib

include       wsock32.inc

includelib    wsock32.lib

;####################################################################

;      equ 数据

;####################################################################

DLG_MAIN          equ    2000

IDC_SERVER    equ    2001

IDC_CONNECT    equ    2002

IDC_INFO          equ    2003

IDC_TEXT          equ    2004

WM_SOCKET      equ    WM_USER + 100

TCP_PORT          equ    9999

;####################################################################

;      数据段

;####################################################################

                  .data?

hWinMain          dd    ?

hSocket       dd    ?

hWinConnect    dd    ?

hWinOK        dd    ?

hWinText          dd    ?

hWinServer    dd    ?

hWinInfo          dd    ?

szReadBuffer      db    32768 dup (?)

                .const

szIP             db    '127.0.0.1',0

szConnect      db     '连接(&C)',0

szDisConnect       db     '断开(&D)',0

szErrIP        db     '无效的服务器IP地址!',0

szErrSocket    db     '创建Socket错误!',0

szErrConnect       db     '无法连接到服务器!',0

;####################################################################

;      代码段

;####################################################################

                  .code

;#####################################################################

; 建立 TCP/IP 连接

;#####################################################################

_Connect          proc

                  local  @szBuffer[256]:byte

                  local  @stSin:sockaddr_in

;********************************************************************

; 转换IP地址并建立socket

;********************************************************************

                  invoke RtlZeroMemory,addr @stSin,sizeof @stSin

                  invoke GetDlgItemText,hWinMain,IDC_SERVER,\

                          addr @szBuffer,sizeof @szBuffer

                  invoke inet_addr,addr @szBuffer

                  .if    eax == INADDR_NONE

                          mov    ebx,offset szErrIP

                          jmp    _Error

                  .endif

                  mov    @stSin.sin_addr,eax

                  mov    @stSin.sin_family,AF_INET

                  invoke htons,TCP_PORT

                  mov    @stSin.sin_port,ax

 

                  invoke socket,AF_INET,SOCK_STREAM,0

                  .if    eax == INVALID_SOCKET

                          mov    ebx,offset szErrSocket

                          jmp    _Error

                  .endif

                  mov    hSocket,eax

;********************************************************************

; 连接到服务器

;********************************************************************

                  invoke EnableWindow,hWinConnect,FALSE

                  invoke EnableWindow,hWinServer,FALSE

                  invoke WSAAsyncSelect,hSocket,hWinMain,WM_SOCKET,\

                        FD_CONNECT or FD_READ or FD_CLOSE or FD_WRITE

                  invoke connect,hSocket,addr @stSin,sizeof @stSin

                 .if    eax == SOCKET_ERROR

                          invoke WSAGetLastError

                          .if eax != WSAEWOULDBLOCK

                                  call      _DisConnect

                                mov    ebx,offset szErrConnect

                                  jmp _Error

                          .endif

                  .endif

                  ret

_Error:

                  invoke MessageBox,hWinMain,ebx,NULL,\

                          MB_OK or MB_ICONWARNING

                  ret

 

_Connect          endp

;####################################################################

; 断开连接

;####################################################################

_DisConnect    proc

 

                  invoke closesocket,hSocket

                 mov    hSocket,0

                  invoke SetWindowText,hWinConnect,addr szConnect

                  invoke EnableWindow,hWinServer,TRUE

                invoke EnableWindow,hWinConnect,TRUE

                  invoke EnableWindow,hWinText,FALSE

                 invoke EnableWindow,hWinOK,FALSE

                  ret

 

_DisConnect    endp

;####################################################################

; 接收TCP数据包

;####################################################################

_RecvData     proc      _hSocket

 

                 invoke RtlZeroMemory,addr szReadBuffer,sizeof szReadBuffer

                  invoke recv,_hSocket,addr szReadBuffer,\

                          sizeof szReadBuffer,NULL

                  .if    eax != SOCKET_ERROR

                          invoke GetWindowTextLength,hWinInfo

                          invoke SendMessage,hWinInfo,EM_SETSEL,eax,eax

                          invoke SendMessage,hWinInfo,EM_REPLACESEL,\

                                FALSE,addr szReadBuffer

                  .endif

                  ret

 

_RecvData     endp

;####################################################################

; 发送输入的文字

;####################################################################

_SendData     proc

                  local  @szBuffer[1024]:byte

 

                  invoke GetDlgItemText,hWinMain,IDC_TEXT,\

                        addr @szBuffer,sizeof @szBuffer

                 invoke lstrlen,addr @szBuffer

                  .if    eax

                         invoke send,hSocket,addr @szBuffer,eax,0

                          .if    eax == SOCKET_ERROR

                                 invoke WSAGetLastError

                                  .if    eax == WSAEWOULDBLOCK

                                          invoke EnableWindow,hWinOK,FALSE

                                .endif

                          .endif

                  .endif

                  invoke SetDlgItemText,hWinMain,IDC_TEXT,NULL

                  ret

 

_SendData     endp

;####################################################################

; 主窗口程序

;####################################################################

_ProcDlgMain      proc      uses ebx edi esi hWnd,wMsg,wParam,lParam

上页:第16章 TCP/IP和网络通信 · 16.3 TCP协议编程(1) 下页:第16章 TCP/IP和网络通信 · 16.3 TCP协议编程(3)

第16章 TCP/IP和网络通信

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号