Hello!This is Basic Win32 API Socket Server Client.Things you find here:
- Create Basic Win32 API Socket Client
- And that's it
This post goes along with previous post named "Basic Win32 API Socket Server",
this client will connect to 127.0.0.1:36665 and expects a message from server,
and will display it upon receival.
Code is managed into seperate files, they are:
- client.asm
- WSAStartup.asm
- socket.asm
- connect.asm
- recv.asm
- closesocket.asm
- WSACleanup.asm
Main compile file is
"client.asm",
all others are include files.
Create Basic Win32 API Socket Client
Create file
"client.asm" and put there following code:
[BITS 32]
; Import function macro
%MACRO dllimport 2
IMPORT %2 %1
EXTERN %2
%ENDMACRO
; Import some function
dllimport kernel32.dll, ExitProcess
dllimport kernel32.dll, Sleep
dllimport user32.dll, MessageBoxA
dllimport Ws2_32.dll, socket
dllimport Ws2_32.dll, WSAStartup
dllimport Ws2_32.dll, WSACleanup
dllimport Ws2_32.dll, WSAGetLastError
dllimport Ws2_32.dll, inet_addr
dllimport Ws2_32.dll, htons
dllimport Ws2_32.dll, closesocket
dllimport Ws2_32.dll, connect
dllimport Ws2_32.dll, recv
dllimport user32.dll, wsprintfA
; Socket constants
AF_INET equ 2
SOCK_STREAM equ 1
IPPROTO_TCP equ 6
; MessageBox constants
MB_OK equ 0x00000000
MB_ICONEXCLAMATION equ 0x00000030
; Macro to display WSA error code and custom error message
%macro display_wsa_error 1
call [WSAGetLastError]
push dword eax
push dword wsaErrorFormat
push dword wsaErrorBuffer
call [wsprintfA]
pop eax
pop eax
pop eax
push dword MB_OK + MB_ICONEXCLAMATION
push dword wsaErrorBuffer
push dword %1
push dword 0
call [MessageBoxA]
%endmacro
[SEGMENT .BSS USE32]
wsaData resb 400
socketHandle resb 4
sockAddr resb 16
wsaErrorBuffer resb 256
acceptHandle resb 4
txtRecvBuffer resb 256
[SEGMENT .DATA USE32]
text_error_WSAStartup db "WSAStartup error",0
text_error_socket db "socket error",0
text_error_WSACleanup db "WSACleanup error",0
text_error_closesocket db "closesocket error",0
text_error_connect db "connect error",0
text_error_recv db "recv error",0
text_received_title db "Received message from server:",0
startupSuccessState db 0
socketCreationState db 0
wsaErrorFormat db "wsaErrorCode: %d",0
ipAddress db "127.0.0.1",0
[SEGMENT .TEXT USE32]
..start:
%include "WSAStartup.asm"
%include "socket.asm"
%include "connect.asm"
%include "recv.asm"
; Display received message
push dword 0
push dword text_received_title
push dword txtRecvBuffer
push dword 0
call [MessageBoxA]
quitProgram:
%include "closesocket.asm"
%include "WSACleanup.asm"
push dword 0
call [ExitProcess]
Create file
"WSAStartup.asm" and put there following code:
; # WSAStartup - initiates use of the Windows Sockets DLL by a process
push dword wsaData
push dword 0x202
call [WSAStartup]
cmp eax,0
je WSAStartupSuccess
; ERROR --------------------------------
display_wsa_error text_error_WSAStartup
jmp quitProgram
WSAStartupSuccess:
mov byte [startupSuccessState],byte 1
Create file
"socket.asm" and put there following code:
; # socket - creates a socket which is bound to a specific service provider
push dword IPPROTO_TCP
push dword SOCK_STREAM
push dword AF_INET
call [socket]
mov [socketHandle],eax
cmp eax,dword 0
jne socketSuccess
; ERROR --------------------------
display_wsa_error text_error_socket
jmp quitProgram
socketSuccess:
mov byte [socketCreationState], byte 1
Create file
"connect.asm" and put there following code:
; # connect - establishes a connection to a peer
; Family
mov [sockAddr],dword AF_INET
; Port
push dword 36665
call [htons]
mov [sockAddr+2],eax
; Address
push dword ipAddress
call [inet_addr]
mov [sockAddr+4],eax
push dword 16
push dword sockAddr
push dword [socketHandle]
call [connect]
cmp eax,0
je .connectSuccess
; ERROR --------------------------
display_wsa_error text_error_connect
jmp quitProgram
.connectSuccess:
Create file
"recv.asm" and put there following code:
; # recv - receives data from a socket
push dword 0
push dword 256
push dword txtRecvBuffer
push dword [socketHandle]
call [recv]
cmp eax,0
jge .receiveSuccess
; ERROR --------------------------
display_wsa_error text_error_recv
jmp quitProgram
.receiveSuccess:
Create file
"closesocket.asm" and put there following code:
; # closesocket - closes a socket
cmp byte [socketCreationState],byte 1
jne .noSocket
push dword [socketHandle]
call [closesocket]
cmp eax,0
je .closeSocketSuccess
; ERROR --------------------------
display_wsa_error text_error_closesocket
.noSocket:
.closeSocketSuccess:
Create file
"WSACleanup.asm" and put there following code:
; # WSACleanup - terminates use of the Windows Sockets DLL
cmp byte [startupSuccessState],byte 1
jne .noStartup
call [WSACleanup]
cmp eax,0
je .cleanupSuccess
; ERROR --------------------------
display_wsa_error text_error_WSACleanup
.noStartup:
.cleanupSuccess:
And that's it NASM cmd: "nasm -fobj client.asm"
ALINK cmd: "alink -c -oPE -subsys windows client.obj"
Now start server.exe, run client.exe, and you should receive a message from server!
Tested, works!
Done, Bye!
Edit: Added attachment, available for download