回复 6楼 bczgvip
版主,再请教个关于VB调用C++编写的winsock的DLL的问题。这个是基于UDP通信的。
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程序就卡死掉了。该怎样修改呢??