首页
社区
课程
招聘
[求助]一段socket代码似乎有问题。高手指教下。连接成功收不到消息
发表于: 2009-7-22 17:45 6424

[求助]一段socket代码似乎有问题。高手指教下。连接成功收不到消息

2009-7-22 17:45
6424
_EventProc        proc
        local        @stSin:sockaddr_in
        invoke        RtlZeroMemory,addr @stSin,sizeof @stSin
        invoke        inet_addr,$CTA0("127.0.0.1")
        .if        eax != INADDR_NONE
                mov        @stSin.sin_addr,eax
                mov        @stSin.sin_family,AF_INET
                invoke        htons,9999                        ;端口
                mov        @stSin.sin_port,ax
                invoke        connect,hSocket,addr @stSin,sizeof @stSin
        .endif
        ret
_EventProc        endp

_InitSocket        proc
                local EventWork:WSANETWORKEVENTS
                local        hEvent
                invoke        socket,AF_INET,SOCK_STREAM,0
                .if        eax        != INVALID_SOCKET
                        mov        hSocket,eax
                        invoke WSACreateEvent
                        mov        hEvent,eax
                        invoke WSAEventSelect,hSocket,hEvent,FD_CONNECT or FD_READ or FD_CLOSE or FD_WRITE
                        .while TRUE
                            invoke WSAWaitForMultipleEvents,1,addr hEvent,FALSE,INFINITE,FALSE;INFINITE
                            invoke WSAResetEvent,hEvent
                            invoke WSAEnumNetworkEvents,hSocket,hEvent,addr EventWork
                                    .if EventWork.lNetworkEvents == FD_CONNECT
                                           
                                             .if EventWork.iErrorCode[FD_CONNECT_BIT] == 0
                                                invoke MessageBox,0,$CTA0("连接成功"),0,0
                                        .else
                                                invoke MessageBox,0,$CTA0("连接失败"),0,0
                                      .endif
                                     
                                    .elseif EventWork.lNetworkEvents == FD_READ
                                      invoke MessageBox,0,$CTA0("READ消息"),0,0                       
                                     
                                    .elseif EventWork.lNetworkEvents == FD_CLOSE
                                      invoke MessageBox,0,$CTA0("连接关闭"),0,0
                                    .endif
                          .endw
                .endif
        ret
_InitSocket        endp

_MainThread        proc
        local        @stWsa:WSADATA,@dwThreadID
        invoke        WSAStartup,2h,addr @stWsa
        invoke        CreateThread,NULL,0,offset _InitSocket,NULL,NULL,NULL
        invoke        CreateThread,NULL,0,offset _EventProc,NULL,NULL,NULL
        ret
_MainThread        endp

代码如上 高手帮忙看下。错在哪里?这段代码如果连接正常 的确连接到服务器 不会提示任何消息
反而连接不成功会提示连接失败 这是为什么?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你的程序不能保证WSAEventSelect 一定比connect先执行
2009-7-23 09:12
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
你的客户端和服务端在同一个进程中,最好分开写,把服务端和客户端分离。
要不会出现如Rootkitche所说的问题,程序本身好像没什么问题。
2009-7-23 09:30
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
明白了
有没啥好的解决办法? 活更合理算法
我在两条线程中间加个SLEEP函数试试
2009-7-23 21:05
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我试了下 在 invoke  CreateThread,NULL,0,offset _InitSocket,NULL,NULL,NULL
下面加了SLEEP函数 设置延时10秒开启connect 线程
结果还是 10秒以后服务段提示已经连接上 但是 客户端还是没有任何提示。似乎就是连接成功了 却没有FD_CONNECT 相反 如果在服务段断开连接。客户端会立即提示 FD_CLOSE 连接关闭
不开启服务器段 让客户端连接失败 到时会收到 连接失败 的提示。。真的头大了
2009-7-23 21:11
0
雪    币: 218
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
invoke MessageBox,0,$CTA0("连接关闭"),0,0

好几处$CTA0是什么意思啊?难道那个参数不用定义可以直接这样用吗?
什么编译器可是认识这种写法啊?RadAsm不行啊!
2009-7-23 21:37
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
找KMD驱动汇编里有个宏定义文件 可以拿过来用  似乎MASM32本身也有这种定义的宏  他的例子文件下有很多例子 可以找找看
2009-7-24 00:33
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
WSAEventSelect 会将socket设为非阻塞模式
用非阻塞socket进行连接,一般会返回SOCKET_ERROR并且WSAGetLastError会返回WSAEWOULDBLOCK
只有在连接返回SOCKET_ERROR并且WSAGetLastError会返回WSAEWOULDBLOCK的情况下,而且通过WSAEventSelect登记了FD_CONNECT,应用程序连接成功才会得到FD_CONNECT通知

你检查connect返回值了么?

补充一句:
你这个程序用不着多线程,在连接调用后,直接进入通知等待和通知处理就行了
2009-7-24 09:59
0
雪    币: 100
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
帮顶下,汇编不会写,但是C语言就可以看TDI例子
2009-7-26 13:01
0
游客
登录 | 注册 方可回帖
返回
//