首先,对不起我的英语不好,英语不是我的第一语言。 所以,我试图在Assembly 32 BIT,MASM中编写聊天程序。
现在,我正在编写服务器端代码,到目前为止,我使用了WSAStartUp和Socket - Windows API函数,现在我尝试使用Bind函数。
绑定功能的链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
这是我到目前为止编写的代码(我的问题是在代码之后编写的):
.386
.MODEL Flat, STDCALL
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\Ws2_32.inc
includelib \masm32\lib\Ws2_32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.DATA
Success db 'WSAStartUp Succseed!',0
NO_Success db 'WSAStartUp NOT Succseed....',0
Socketsu db 'Socket :(:(:(:(',0
SocketSuccess db 'Socket Success!! :)',0
Bindno db 'Bind Error',0
Bindyes db 'Bind Success! :)',0
LocalIP db "127.0.0.1",0
port dd 8020
.DATA?
wsadata db 400 dup (?) ;WSADATA struct that hold the information about the Windows Sockets implementation.(info ret from WSATSTARTUP)
flag dw ?
ListenSocket dd ?
SockAddrStruct db 30 dup (?)
;so sockaddr_in <?>
sockaddrs db 16 dup (?)
.CONST
wVersionRequested equ 0101h
.CODE
main:
;-------------------WSAStartUp-----------------------;
;Initialize the work with winsock (WS StartUp = WINSOCK START UP)
invoke WSAStartup,wVersionRequested, offset wsadata
.if eax!=0
invoke MessageBoxA,NULL,offset NO_Success,offset NO_Success,MB_OK
jmp End_Program
.else
invoke MessageBoxA,NULL,offset Success,offset Success,MB_OK
.endif
;-------------------Socket-----------------------;
;AF_INET - address family(in format: host,port) to likboa the type of addresses that the socket can communicate with
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
.IF eax==INVALID_SOCKET
invoke MessageBoxA,NULL,offset Socketsu,offset Socketsu,MB_OK
jmp End_Program
.else
invoke MessageBoxA,NULL,offset SocketSuccess,offset SocketSuccess,MB_OK
mov [ListenSocket],eax
.ENDIF
;-------------------Bind-------------------------;
;SockAddr Struct:
mov eax,AF_INET
mov [dword ptr sockaddrs],eax
invoke htons,[port]
mov [dword ptr sockaddrs+2],eax
invoke inet_addr,[dword ptr LocalIP]
mov [dword ptr sockaddrs+4],eax
invoke bind,SIZEOF sockaddrs,offset sockaddrs,ListenSocket
.if eax==0
invoke MessageBoxA,NULL,offset Bindyes,offset Bindyes,MB_OK
.else
invoke MessageBoxA,NULL,offset Bindno,offset Bindno,MB_OK
.endif
End_Program:
invoke ExitProcess,0
end main
我不知道问题是什么。但是当我运行代码时,我得到了我构建的MessageBox:绑定错误。
我想这是sockaddrs结构中的一个问题(我将值放入其中的方式)。但我不知道我需要改变什么以及如何解决它。
我想也许可以使用WSAGetLastError函数来查看错误是什么,但我不知道如何打印函数返回的值,看看错误是什么(我不能放入调用MessageBox,一个参数EAX(保存返回值的寄存器))。
所以有人可以帮助我解决问题在&#39; Bind&#39;一部分?
非常感谢!