MASM中的Winsock-bind函数错误(32位asm)

时间:2015-09-19 13:19:16

标签: api assembly bind winsock masm32

首先,对不起我的英语不好,英语不是我的第一语言。 所以,我试图在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;一部分?

非常感谢!

0 个答案:

没有答案