首页
社区
课程
招聘
一段很奇怪的代码
发表于: 2006-5-7 04:41 4190

一段很奇怪的代码

2006-5-7 04:41
4190
Main proc
        LOCAL        @Socket:SOCKET
        LOCAL        @addr:sockaddr_in
        LOCAL        @Event:HANDLE
        LOCAL        @NetWork:WSANETWORKEVENTS
        LOCAL        @wsaData:WSADATA
       
        invoke WSAStartup,202h,addr @wsaData
       
        .while TRUE
                mov @Socket,FUNC(socket,AF_INET,SOCK_STREAM,0)
                mov @Event,FUNC(WSACreateEvent)
               
                mov @addr.sin_family,AF_INET
                mov @addr.sin_addr,FUNC(inet_addr,SADD("127.0.0.1"))
                invoke htons,90
                mov @addr.sin_port,ax
               
                invoke WSAEventSelect,@Socket,@Event,FD_CONNECT
               
                invoke connect,@Socket,addr @addr,sizeof @addr
               
                .while TRUE
                        invoke WaitForSingleObject,@Event,INFINITE
                        invoke WSAResetEvent,@Event
                        invoke WSAEnumNetworkEvents,@Socket,@Event,addr @NetWork
                       
                        .if @NetWork.lNetworkEvents & FD_CONNECT
                                .if BYTE PTR @NetWork.iErrorCode[FD_CONNECT_BIT] != 0
                                        invoke wsprintf,addr buf,SADD("连接失败,错误码:%d"),FUNC(WSAGetLastError)
                                        invoke MessageBox,0,addr buf,0,0
                                        .continue
                                .endif
                               
                                invoke wsprintf,addr buf,SADD("连接成功,错误码:%d"),FUNC(WSAGetLastError)
                                invoke MessageBox,0,addr buf,0,0
                        .endif
                .endw
        .endw
        mov eax,0
        Ret
Main EndP

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我测试这段代码的时候,发现一个很奇怪的问题

如果我直接运行程序

程序会执行到
        invoke wsprintf,addr buf,SADD("连接成功,错误码:%d"),FUNC(WSAGetLastError)
        invoke MessageBox,0,addr buf,0,0

但是我本机根本没有监听端口

如果我用OB在
.if @NetWork.lNetworkEvents & FD_CONNECT
这里下断点,然后单步走

可以进入预期的

invoke wsprintf,addr buf,SADD("连接失败,错误码:%d"),FUNC(WSAGetLastError)
          invoke MessageBox,0,addr buf,0,0

为什么会出现这两种结果呢?
2006-5-7 04:43
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
还有,我捕获
WSAEnumNetworkEvents函数的错误

发现返回10035
无法立即完成一个非阻挡性套接字操作。

奇怪的很
2006-5-7 04:45
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这里写错了
.if BYTE PTR @NetWork.iErrorCode[FD_CONNECT_BIT] != 0

应该是
.if DWORD PTR @NetWork.iErrorCode[FD_CONNECT_BIT] != 0

但是关键问题不在这里
2006-5-7 04:56
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
哦,终于知道了~~~

数组下标的错误
FD_CONNECT_BIT应该乘以4

C语言里面,编译器帮忙搞定了,asm需要自己算下标
2006-5-7 04:58
0
游客
登录 | 注册 方可回帖
返回
//