【问题标题】:access violation socket accept() on masm32masm32 上的访问冲突套接字接受()
【发布时间】:2013-09-20 06:03:46
【问题描述】:

我正在尝试使用 masm32 创建一个“套接字”,但 accept() 有问题,当代码尝试执行 accept() 时 ollydbg 向我显示访问冲突,我不知道出了什么问题,谁能告诉我如何解决它,好吗?

.686
.model flat, stdcall
option casemap:none

extrn ExitProcess@4:PROC
extrn WSAStartup@8:PROC
extrn socket@12:PROC
extrn bind@12:PROC
extrn listen@8:PROC
extrn accept@12:PROC

WSADATA STRUCT 8
wVersion          WORD  ?
wHighVersion      WORD  ?
iMaxSocket        WORD  ?
iMaxUdpDg         WORD  ?
lpVendorInfo      DWORD ?
szDescription     SBYTE 257 dup (?)
szSystemStatus    SBYTE 129 dup (?)
WSADATA ENDS

sockaddr STRUCT
sa_family   WORD ?
sa_port     WORD  ?
sa_addr     DWORD ?
            BYTE 8 dup (?)
sockaddr ENDS

.const
address sockaddr<2, 0B922h, 00000000h>
sbuff BYTE 50 dup (0)

.data?
wsadata WSADATA <>
Socket DWORD ?
.code

Start proc
push ebp
mov ebp, esp

lea edx, wsadata
push edx
push 2h
call WSAStartup@8

push 0h
push 1h
push 2h
call socket@12
mov Socket, eax

push 16h
lea ecx, address
push ecx
push Socket
call bind@12

push 1h
push Socket
call listen@8

push 16h
lea ecx, address
push ecx
push Socket
call accept@12



mov eax, 0
call ExitProcess@4

mov esp, ebp
pop ebp

Start endp
END

问候

【问题讨论】:

    标签: windows sockets assembly masm masm32


    【解决方案1】:

    access 的第三个参数是一个指向长度的指针,而不是长度本身。

    顺便说一句:结构是 16(十进制),而不是 16h 字节长。

    因此您的代码应如下所示:

    .data?
    wsadata WSADATA <>
    Socket DWORD ?
    addrlen DWORD 10h        <- This one is new!
    .code
        ...
    push 10h                 <- Instead of 16h
        ...
    call bind@12
        ...
    lea ecx, addrlen
    push ecx
    lea ecx, address
    push ecx
    push Socket
    call accept@12
    

    【讨论】:

    • 关于结构体大小; MASM32 还有LENGTHOF variableSIZEOF variableSIZEOF type 运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2020-06-27
    • 2015-01-26
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多