标准MFC WinSock ActiveX控件开发实例(II)高级篇
2009-05-11 20:06:17 来源:WEB开发网三、为Connect()接口添加源代码,看起来如下:
//网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数
long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data,
const VARIANT FAR& DataType,
const VARIANT FAR& DataLength,
const VARIANT FAR& TimeOut)
{
// TODO: Add your dispatch handler code here
if(!OnlySock)
return -1;//网络尚未开始建立连接
int gDataType = VariantToLong(DataType);
long gDataLength = VariantToLong(DataLength);
int gTimeOut = VariantToLong(TimeOut);
if(gDataType < 0)
return -2;
if(gDataLength <= 0)
return -2;
if(gTimeOut < 0)
return -2;
switch(gDataType)
{
case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围)
case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送
case 2://当指定该值为2时,当Date为整型数组时,将把一个int转换成四个char传送
case 3://当指定该值为3时,当Date为无符号短整型数组时,将把一个unsigned short转换成两个char传送
case 4://当指定该值为4时,当Date为BYTE数组时,将把一个BYTE转换成一个char传送
case 5://当指定该值为5时,当Date为短整型数组时,将把一个short转换成两个char传送
case 6://当指定该值为6时,当Date为浮点型数组时,将把一个float转换成四个char传送
case 7://当指定该值为7时,当Date为双精度数组时,将把一个double转换成八个char传送
break;
default://如果不在上面取值范围内,将按当前的Data相应类型进行传送
break;
}
timeval tv;
fd_set fdwrite;
int len = 0;
long m = 0;
long n = 0;
long changetype = 0;//将浮点型数据进行类型转换,再进行传送
VARIANT gData;
VariantInit(&gData);
//送出信息至服务器
FD_ZERO(&fdwrite);
tv.tv_sec = gTimeOut;//指定时间后返回
tv.tv_usec = 0;
FD_SET(OnlySock,&fdwrite);//是否可以发送数据
select(0,NULL,&fdwrite,NULL,&tv);
char *buffer = NULL;
if(FD_ISSET(OnlySock,&fdwrite))
{
switch(Data.vt)
{
case VT_BSTR://按字符串形式发送
buffer = _com_util::ConvertBSTRToString(Data.bstrVal);
break;
case VT_BYREF|VT_UI1:
//按BYTE*形式发送
buffer = new char[gDataLength];
memcpy(buffer,Data.pbVal,gDataLength);
break;
case VT_BYREF|VT_I1://按 char * 发送
buffer = new char[gDataLength];
memcpy(buffer,Data.pcVal,gDataLength);
break;
case VT_ARRAY|VT_I4://以长整型数组发送
gData.vt = VT_I4;
if(gDataType!=0)//long = char*4
{
//sizeof(long),在这里一个长整型的长度为4个char
buffer = new char[gDataLength];
for(m=0,n=0; n<gDataLength/4; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.lVal);
buffer[m++] = (gData.lVal>>24)&0xff;
buffer[m++] = (gData.lVal>>16)&0xff;
buffer[m++] = (gData.lVal>>8)&0xff;
buffer[m++] = gData.lVal&0xff;
}
}
else//long = char*1 //数据可能溢出
{
buffer = new char[gDataLength];
for(m=0,n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.lVal);
buffer[n] = (char)gData.lVal;
}
}
break;
case VT_ARRAY|VT_INT://以整型数组发送
gData.vt = VT_INT;
if(gDataType != 0)
{
//一个int等于四个char
buffer = new char[gDataLength];
for(m=0,n=0; n<gDataLength/4; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.intVal);
buffer[m++] = (gData.intVal>>24)&0xff;
buffer[m++] = (gData.intVal>>16)&0xff;
buffer[m++] = (gData.intVal>>8)&0xff;
buffer[m++] = gData.intVal&0xff;
}
}
else
{
buffer = new char[gDataLength];
for(n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.intVal);
buffer[n] = (char)gData.intVal;
}
}
break;
case VT_ARRAY|VT_UI1://以BYTE数组发送
gData.vt = VT_UI1;//一个char等于一个BYTE不必进行转换
buffer = new char[gDataLength];
for(n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.bVal);
buffer[n] = gData.bVal;
}
break;
default://在这里没有一一列出其它类型,剩下的就由阁下进行数据转换处理了,我就偷懒了^_^
return -3;//传入的数据类型不被支持
}
len = send(OnlySock, buffer, gDataLength, 0);//发送数据
delete[] buffer;
buffer = NULL;
if (len<=0)// == SOCKET_ERROR)
{
return -101;//无法发送数据,对方可能已断开连接
}
}
else
{
return 0;//网络超时
}
VariantClear(&gData);
return len;
}
更多精彩
赞助商链接