-
-
[求助]求助一个bind问题
-
发表于: 2010-3-12 19:41 3007
-
使用的是罗老大的代码改的一段代码,用于在本地bind一个端口,然后接受一个连接,目的在于测试是否能绑定成功并且能响应一个连接,后面的多线程的接受工作先不谈。
其中_ListenThread是导出函数。
用外部程序调用这个函数。但是每次在bind的时候都不成功,错误代码WSAEFAULT。感觉很差异,完整代码如下。
其中_ListenThread是导出函数。
用外部程序调用这个函数。但是每次在bind的时候都不成功,错误代码WSAEFAULT。感觉很差异,完整代码如下。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Sample code for < Win32ASM Programming 3rd Edition> ; by 罗云彬, http://www.win32asm.com.cn ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Dll.asm ; 用来被嵌入到其它进程执行的测试 dll ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 使用 nmake 或下列命令进行编译和链接: ; ml /c /coff DLL.asm ; Link /subsystem:windows /Dll DLL.obj ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .386 .model flat, stdcall option casemap :none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include wsock32.inc includelib wsock32.lib include _Message.inc ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TCP_PORT equ 9999 WM_SOCKET equ WM_USER + 12 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data ;hInstance dd ? ;hWinMain dd ? hSocket dd ? szServer db '127.0.0.1',0 szUserName db 12 dup (?) szPassword db 12 dup (?) szText db 256 dup (?) ;szSendMsg MSG_STRUCT 10 dup (<>) ;szRecvMsg MSG_STRUCT 10 dup (<>) dwSendBufSize dd ? dwRecvBufSize dd ? dbStep db ? szIP db 20 dup (?) bindfail db '绑定端口失败',0 socketFail db 'socket建立失败',0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data? hInstance dd ? hWinMain dd ? hListenSocket dd ? .const szClassName db 'RemoteClass',0 szCaptionMain db 'RemoteWindow',0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code ;include Connect.asm _ListenThread proc uses edi esi ebx,_lParam,dwPort local @stSin:sockaddr_in local @OtherstSin:sockaddr_in local @OtherstSinLen ;******************************************************************** ; 创建 socket ;******************************************************************** invoke socket,AF_INET,SOCK_STREAM,0 mov hListenSocket,eax invoke RtlZeroMemory,addr @stSin,sizeof @stSin invoke RtlZeroMemory,addr @OtherstSin,sizeof @OtherstSin mov eax,dwPort invoke htons,ax mov @stSin.sin_port,ax mov @stSin.sin_family,AF_INET mov @stSin.sin_addr,INADDR_ANY invoke bind,hListenSocket,addr @stSin,sizeof @stSin .if eax invoke WSAGetLastError .if eax == WSAEFAULT invoke MessageBox,NULL,addr bindfail,addr bindfail,NULL .endif ret .endif ;******************************************************************** ; 开始监听,等待连接进入并为每个连接创建一个线程 ;******************************************************************** invoke listen,hListenSocket,5 .while TRUE invoke accept,hListenSocket,addr @OtherstSin,addr @OtherstSinLen .break .if eax == INVALID_SOCKET mov eax,@OtherstSin.sin_addr invoke inet_ntoa,eax invoke lstrcpy,offset szIP,eax lea eax ,offset szIP ret ;invoke CloseHandle,eax .endw invoke closesocket,hListenSocket ret _ListenThread endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllEntry proc _hInstance,_dwReason,_dwReserved local @dwThreadID local @stWsa:WSADATA .if _dwReason == DLL_PROCESS_ATTACH push _hInstance pop hInstance invoke WSAStartup,101h,addr @stWsa .endif mov eax,TRUE ret DllEntry Endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End DllEntry
赞赏
他的文章
看原图
赞赏
雪币:
留言: