+ -
当前位置:首页 → 问答吧 → 初学winsocket编程,请教一个问题

初学winsocket编程,请教一个问题

时间:2010-11-20

来源:互联网

小弟初学,下面这个是从8888端口接收数据包的程序
但是不知道为什么,发送端只发了一个包,下面这个的程序窗口过程就不断的接收到 WM_SOCKET 消息,
直到窗口过程有别的消息到了才停止,如果一直不去动它,就一直CPU占用很高的在那里接这个消息。
缓冲区够用,发送的数据包只有4字节的数据。

请大侠指点一下 O(∩_∩)O谢谢

Assembly code

        .386
        .model flat, stdcall
        option casemap :none   ; case sensitive


include        D:\kmd\masm32\INCLUDE\windows.inc
include        D:\kmd\masm32\INCLUDE\user32.inc
includelib    D:\kmd\masm32\LIB\user32.lib
include        D:\kmd\masm32\INCLUDE\kernel32.inc
includelib    D:\kmd\masm32\LIB\kernel32.lib
include        D:\kmd\masm32\INCLUDE\wsock32.inc
includelib    D:\kmd\masm32\LIB\wsock32.lib



IDC_EDIT1    equ    10
IDD_DIALOG1    equ    1
IDC_BUTTON1    equ    20
WM_SOCKET       equ    WM_USER + 100
.data?
hInstance    dd    ?
hSocket        dd    ?
hWinMain    dd    ?
.data
stSin        sockaddr_in <>
lpBuffer    dd  10  dup   (?)
ssssss        dd    0
LocalIP        db    '192.168.1.200',0
szErrIP        db    '无效的服务器IP地址!',0
stSin2        sockaddr_in <>
.code

_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
        local    @stWsa:WSADATA
        local    @long
        
        mov    eax,wMsg
;********************************************************************
        .if    eax ==    WM_SOCKET
            invoke    RtlZeroMemory,offset lpBuffer,sizeof lpBuffer
            invoke    RtlZeroMemory,offset stSin2,sizeof stSin2

            invoke    recvfrom,hSocket,offset lpBuffer,40,0,offset stSin2,addr @long

;********************************************************************
        .elseif    eax ==    WM_INITDIALOG
            push hWnd            
            pop hWinMain
            invoke    WSAStartup,101h,addr @stWsa
            invoke    socket,AF_INET,SOCK_DGRAM,0
            mov hSocket,eax
            invoke    WSAAsyncSelect,hSocket,hWinMain,WM_SOCKET,FD_READ
            invoke    inet_addr,offset LocalIP
                .if    eax ==    INADDR_NONE
                    invoke    MessageBox,hWnd,addr szErrIP,NULL,MB_OK or MB_ICONSTOP
                .endif
            mov stSin.sin_addr,eax
            mov stSin.sin_family,AF_INET

            invoke htons,8888
            mov stSin.sin_port,ax
            invoke    bind,hSocket,offset stSin,sizeof stSin
    

;********************************************************************
        .elseif    eax ==    WM_CLOSE
            invoke    closesocket,hSocket
            invoke    WSACleanup
            invoke    EndDialog,hWnd,NULL
;********************************************************************
        .else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret

_ProcDlgMain    endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    DialogBoxParam,hInstance,IDD_DIALOG1,NULL,offset _ProcDlgMain,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start

作者: shuzihuozifuzuhe   发布时间: 2010-11-20

你在recvfrom后,用close关闭socket,再试试还能不能,收到包,呵呵。

作者: asmlearn   发布时间: 2010-11-20