| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2340 人关注过本帖
标题:VB调用C++编写的winsock的DLL时,程序卡死掉??
只看楼主 加入收藏
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
结帖率:57.14%
收藏
已结贴  问题点数:15 回复次数:7 
VB调用C++编写的winsock的DLL时,程序卡死掉??
DLL部份代码如下:
//PmuDll.cpp
struct SendData
{
    BYTE data[12] ;
}SendBuf,*pSendBuf;        //需要发送的数据包和数据包地址的缓存区

struct RecvData
{
    BYTE data[2] ;
}RecvBuf,*pRecvBuf;       //需要接收的数据包和数据包地址的缓存区

SOCKET s ;                    //声明套接字变量  
SOCKADDR_IN addrSock ;        //声明发送或接受数据的地址变量

void UDP_Socket(char *dwIP ,u_short PortNo)
{
    WSADATA wsadata ;                            //库版本的相关信息
    WORD wVersionRequested ;                        //加载的Winsock的版本
    int err ;                                        //用于标志初始化是否成功
wVersionRequested = MAKEWORD(2, 0) ;         //通过MAKEWORD给版本号//的高低位赋值
err = WSAStartup(wVersionRequested ,&wsadata) ;    //WSAStartup函数被用来加载Winsock库,即初始化//Socket环境,若返回0,初始化成功,否则初始化失败
    if(err != 0)
    {
        return ;
    }
    if (LOBYTE(wsadata.wVersion != 2) || HIBYTE(wsadata.wVersion != 0))
    {
        WSACleanup() ;
        MessageBox(NULL ,"版本出错!", "提示" ,MB_OK ) ;    //关闭SOCK环境
        return ;
    }
    s = socket(AF_INET ,SOCK_DGRAM ,0) ;                    //设置SOCKET套字
    if(INVALID_SOCKET == s)
    {
        MessageBox(NULL ,"创建套字失败!", "提示" ,MB_OK || MB_DEFBUTTON1 ) ;
        return ;
    }
    addrSock.sin_addr.S_un.S_addr = inet_addr(dwIP) ;            //IP地址
    addrSock.sin_family = AF_INET ;                            //网络类型
    addrSock.sin_port = htons(PortNo) ;                        //端口
    int len = sizeof(SOCKADDR) ;
    pSendBuf = &SendBuf ;                                    //需要发送数据包的地址
    //发送数据   
    sendto(s ,(char*)pSendBuf ,sizeof(SendData) + 1 ,0 ,(SOCKADDR*)&addrSock ,len) ;
   


//接收数据
    pRecvBuf = &RecvBuf ;
    recvfrom(s ,(char*)pRecvBuf ,sizeof(RecvData) ,0 ,(SOCKADDR*)&addrSock ,&len) ;
    closesocket(s) ;
    WSACleanup() ;
}

在VB中调用PmuDll.DLL时出现了问题,DLL中注释掉接收远程机数据包的函数(recvfrom),程序能够运行,且远程机也能接收到发给它的数据;若不注释掉这个recvfrom函数,VB程序一运行,然后再调用这个UDP_Socke函数,VB程序就卡死掉了。该怎样修改呢??
搜索更多相关主题的帖子: 数据包 信息 声明 
2011-10-21 13:33
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:8 
用线程接收数据吧。vbgood 里有说线程的,自己看把。
vb6的线程能让人吐血,至少我吐过了。
2011-10-21 14:56
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:8 
线程,我还没 弄过 。

以前按例子抄了一个, 调试环境 可以执行,正常。
编译后,一执行就非法操作。郁闷,吐血。

是不是 recvfrom 这个函数里会死等????

授人于鱼,不如授人于渔
早已停用QQ了
2011-10-21 15:51
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 2楼 bczgvip
没有其它方法了吗?
2011-10-21 17:54
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
你的代码一定要【recvfrom】,那就只能用线程了。
难道就没调试过吗?【recvfrom】会等到成功接收到数据,才会往下运行。
2011-10-21 18:44
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 5楼 bczgvip
但是winsock接收的函数只有这个啊,这个程序其实是PC机和单片机通过UDP通信的,我PC机先发一条指令给单片机,然后单片机再返回我要的数据。通过验证就是这个【recvfrom】函数引起的,不接收的话(即不要【recvfrom】),程序能运行,但只要我点接收的话,程序就卡死了。
2011-10-23 22:40
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
那么就用【WSAAsyncSelect】来将SOCKET与窗口绑定吧。接收到信息可以触发事件,具体的自己找资料吧。
2011-10-24 13:53
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 3楼 风吹过b
是的,程序会死等,就好像卡死了的,点什么都没反应,有办法解决没呢?
2011-10-25 10:44
快速回复:VB调用C++编写的winsock的DLL时,程序卡死掉??
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030836 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved