简单问题,用过CMSWinSockControl控件的兄弟姐妹请回答:要求该控件获得数据

zzz1228 2002-11-12 02:58:28
项目经理要求利用CMSWinSockControl控件获得数据,
在一个对话框中,我拖入一个CMSWinSockControl控件到对话框后,利用classwizard给
控件命名,编译就出错,为什么??
void CMSWinsockControl::GetData(VARIANT* data, const VARIANT& type, const VARIANT& maxLen)
void CMSWinsockControl::Connect(const VARIANT& RemoteHost, const VARIANT& RemotePort)
这两个函数中的参数分别代表什么??

...全文
186 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzz1228 2002-11-18
  • 打赏
  • 举报
回复
再请问两位:我要在服务器和客户机之间通讯,该怎样实现
zzz1228 2002-11-18
  • 打赏
  • 举报
回复
多谢两位啦
wj59(wj59) ,我想不用大侠帮我翻译英文单词,^_^
Qinzixiong(花无才) ,感谢你啦,等我试过之后给分
zzz1228 2002-11-18
  • 打赏
  • 举报
回复
Qinzixiong(花无才) ;请问为什么在接收端不加OnSend()函数就接不到数据???
不明白???
Qinzixiong 2002-11-15
  • 打赏
  • 举报
回复
首先,声明一些全局公共变量,代码如下所示:

BYTE send_data_buf[100]; // 发送缓冲区

BYTE recv_data_buf[500]; // 接收缓冲区

int send_data_len; //发送数据长度

int recv_data_len; //接收数据长度

m_slave1是Winsock控件。

动态初始化设置Winsock控件的一些属性,准备通信。

void CWinsock_exampleDlg::OnConnect()

{

VARIANT LocalPort_VT,LocalIP_VT;

m_slave1.Close(); // 关闭当前Winsocket

m_slave1.SetLocalPort(m_port); //本机端口号

m_slave1.SetRemotePort(m_port); //远程端口号

m_slave1.SetRemoteHost(m_udp_ip_port); //对方IP地址

m_slave1.SetProtocol(1); // 选择UDP协议,1=UDP, 0=TCP

LocalPort_VT.vt=VT_I2;//数据为整数

LocalPort_VT.lVal= m_port;

LocalIP_VT.vt=VT_BSTR;//数据为字符串

LocalIP_VT.bstrVal=m_slave1.GetLocalIP().AllocSysString();

m_slave1.Bind(LocalPort_VT,LocalIP_VT); // 绑定本机IP地址和端口号

VARIANT comm_vt;

CString temp="Hello";

comm_vt.vt=VT_BSTR;

comm_vt.bstrVal=temp.AllocSysString();

m_slave1.SendData(comm_vt);//发送连接信息

}

  连接操作完成,控件初始化完成,即可发送数据到对方。因此在Winsock控件的Send事件中加入以下代码:

void CWinsock_exampleDlg::OnSend()

{

SAFEARRAY * psa;//安全数组

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = send_data_len; // SAFEARRAY长度

psa = SafeArrayCreate(VT_UI1, 1, rgsabound);//创建类型为字节的数组

long len;

for(len=0;len<send_data_len;len++)

SafeArrayPutElement(psa, &len, &send_data_buf[len]);//缓冲区数据入安全数组

VARIANT send_var;

send_var.vt=VT_ARRAY|VT_UI1;

send_var.parray=psa;

m_slave1.SendData(send_var);//数据发送

}

系统收到网络数据包,如果数据包IP地址、端口、协议类型与Winsock控件网络参数吻合,将触发消息,通知控件进行处理,即触发Winsock控件的DataArrival事件。本例中将获取的二进制数据转化成ASCII,因此在Winsock控件的DataArrival事件加入以下代码:

void CWinsock_exampleDlg::OnDataArrivalWinsockSlave1(long bytesTotal)

{

SAFEARRAY * psa_recv;

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = bytesTotal;// 设置数组的长度

psa_recv = SafeArrayCreate(VT_UI1, 1, rgsabound);

VARIANT recv_var;

recv_var.vt=VT_ARRAY|VT_UI1;//设置数据类型为字节型数组

recv_var.parray=psa_recv;

VARIANT Vtype;

Vtype.vt=VT_ERROR;

VARIANT Maxlen;

Maxlen.vt=VT_I4;

Maxlen.lVal=bytesTotal;

m_slave1.GetData(&recv_var,Vtype,Maxlen);//接收数据包

psa_recv=recv_var.parray;

long len;

for(len=0;len< bytesTotal;len++)

SafeArrayGetElement(psa_recv, &len, &recv_data_buf[len]);//数据存入接收缓冲区

BYTE temp;

long ls_len=0;

m_edit_input_cs=m_edit_input_cs+"\r\n Receive Packer: ";

ls_len=m_edit_input_cs.GetLength();

for(len=0;len< bytesTotal;len++)// 二进制字节数据转换为ASCII码显示。

{

temp=' ';

m_edit_input_cs.Insert(ls_len,temp);

ls_len++;

temp=recv_data_buf[len]>>4;

temp=temp&0x0f;

if(temp>=0 && temp<=9) temp=temp+0x30;// 数字

else temp=temp+0x37;//字母

m_edit_input_cs.Insert(ls_len,temp);

ls_len++;

temp=recv_data_buf[len];

temp=temp&0x0f;

if(temp>=0 && temp<=9) temp=temp+0x30;

else temp=temp+0x37;

m_edit_input_cs.Insert(ls_len,temp);

ls_len++;

}

UpdateData(FALSE);

}

wj59 2002-11-15
  • 打赏
  • 举报
回复
GetData:data:数据,type:数据类型,maxLen:数据长度


Connect:RemoteHost:地址,RemotePort:端口号


全部是引用
zzz1228 2002-11-13
  • 打赏
  • 举报
回复
没人用过吗?清帮忙回答一下,焦头烂额
zzz1228 2002-11-12
  • 打赏
  • 举报
回复
void CMSWinsockControl::GetData(VARIANT* data, const VARIANT& type, const VARIANT& maxLen)
void CMSWinsockControl::Connect(const VARIANT& RemoteHost, const VARIANT& RemotePort)
这两个函数中的参数分别代表什么?
是不是全部是返回的数据?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧