使用WSARecvFrom函数,发送和接收两个结构体。在发送端发送后,接收端却只能读取第一个结构体的数据,而第二个结构体的数据读不出来。
关键问题在于,接收端虽然接收到了所有数据,但就是无法将第二个结构体中的数据显示出来。因为我通过查看接收端接收的数据长度后,发现与发送端发送的数据长度是一致的,但就是无法显示出来。
发送端的代码是:
DWORD dwIP;
CString strSend;
WSABUF* pWsabuf = new WSABUF[1];
WSABUF wsabuf;
DWORD dwSend;
int len;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN addrTo;
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(9000); GetDlgItemText(IDC_EDIT_SEND,strSend);
len = strSend.GetLength();
wsabuf.buf = strSend.GetBuffer(len);
wsabuf.len = len + 1;

char FAR *p = "111";
pWsabuf[0] = wsabuf;
pWsabuf[1].buf = p ;
pWsabuf[1].len = strlen("111") + 1; SetDlgItemText(IDC_EDIT_SEND,""); if(WSASendTo(m_socket,pWsabuf,2,&dwSend,0,(SOCKADDR*)&addrTo,
sizeof(SOCKADDR),NULL,NULL) 
== SOCKET_ERROR )
{
MessageBox("发送失败");
return;
} return;
接收端的代码是:
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF* pWsabuf = new WSABUF[1];

WSABUF wsabuf;
wsabuf.buf = new char[200];
wsabuf.len = 200;
memset(wsabuf.buf,0,200);

pWsabuf[0].buf = new char[200];
pWsabuf[0].len = 200;
memset(pWsabuf[0].buf,0,200);
pWsabuf[1] = wsabuf; DWORD dwRead;
DWORD dwFlag = 0;
SOCKADDR_IN addrFrom;
int len = sizeof(SOCKADDR);

CString str;
CString strTemp;
if(WSARecvFrom(m_socket,pWsabuf,2,&dwRead,&dwFlag,
(SOCKADDR*)&addrFrom,&len,NULL,NULL) == SOCKET_ERROR)
{
MessageBox("接收失败");
return;
}
MessageBox(pWsabuf[1].buf);
str.Format("%s说 :%s",inet_ntoa(addrFrom.sin_addr),
pWsabuf[0].buf);
str += "\r\n";
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str += strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);

break;
}
return;
问题就在于作为第二个结构体发送的"111"无法在客户端显示出来。这是为什么呢?

解决方案 »

  1.   

    WSABUF* pWsabuf = new WSABUF[1];这里应该是2
    接收端也有同样的问题
      

  2.   

    只new了一个wsabuf结构,却发送2个。内存堆里越界,这样程序不会崩溃吗?
      

  3.   

    改成WSABUF* pWsabuf = new WSABUF[2];也不行啊。就是把他改成WSABUF[3]接收到的也只有一个结构体。
      

  4.   


          pWsabuf[0].buf = new char[200];
            pWsabuf[0].len = 200;
            memset(pWsabuf[0].buf,0,200);
            pWsabuf[1] = wsabuf;
    第一个包要收200字节
    发送的第一个包有200个字节么?
    很明显是pWsabuf[0].buf包含了你发送的所有数据
    在调试状态下你看看pWsabuf[0].buf的数据内容是啥,是不是包含2个数据包的内容
      

  5.   


    谢谢你!!由于你的提示,问题解决了。
    我在发送的时候,把发送端的发送长度设为200就可以。
    或者说接收端接收长度减少。不过要说明的一点是原有的程序并不会把所有的数据都包含在pWsabuf[0].buf里面。
    接分吧!