使用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"无法在客户端显示出来。这是为什么呢?
关键问题在于,接收端虽然接收到了所有数据,但就是无法将第二个结构体中的数据显示出来。因为我通过查看接收端接收的数据长度后,发现与发送端发送的数据长度是一致的,但就是无法显示出来。
发送端的代码是:
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"无法在客户端显示出来。这是为什么呢?
接收端也有同样的问题
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个数据包的内容
谢谢你!!由于你的提示,问题解决了。
我在发送的时候,把发送端的发送长度设为200就可以。
或者说接收端接收长度减少。不过要说明的一点是原有的程序并不会把所有的数据都包含在pWsabuf[0].buf里面。
接分吧!