struct DATAPACKAGE 
{
// char *name;
// DWORD ip;
UINT dataType;
UINT  nlen;
};void CSrvClientDlg::OnBtnSend()  //发送按钮响应函数
{
UpdateData(TRUE);
SOCKADDR_IN addr_to;
addr_to.sin_family=AF_INET;
addr_to.sin_port=htons(m_nPort);
addr_to.sin_addr.S_un.S_addr=inet_addr("233.0.0.1");
int len=m_strSendText.GetLength();
char *pSend=m_strSendText.GetBuffer(len);
    FillDataPackage(pSend,len,TEXTINFO);
DATAPACKAGE *dp=(DATAPACKAGE*)m_pSend;
    if(sendto(m_sock,m_pSend,1024,0,(SOCKADDR*)&addr_to,sizeof(SOCKADDR))==0)
{
MessageBox("发送数据失败");
return ;
}
m_strSendText=""; UpdateData(FALSE);

}BOOL CSrvClientDlg::FillDataPackage(char* pData,UINT len,UINT type)  //填充数据结构函数
{
if(m_pSend==NULL)   //m_pSend是类的一个成员变量
m_pSend=(char*)malloc(1024);
ZeroMemory(m_pSend,1024);
    DATAPACKAGE dp;
dp.dataType=type;
dp.nlen=len;
memcpy(m_pSend,&dp,sizeof(dp));
memcpy(m_pSend+sizeof(dp),pData,len);
return TRUE;
}void CSrvClientDlg::OnNetWorkMsg(WPARAM wParam,LPARAM lParam)
{
SOCKADDR_IN addr_from;
    DATAPACKAGE *dp=NULL;
char *p=NULL;
    if(m_pRecv==NULL)
m_pRecv=(char*)malloc(1024);
ZeroMemory(m_pRecv,1024);
int len=sizeof(SOCKADDR);
if(LOWORD(lParam)==FD_READ)
{
recvfrom(m_sock,m_pRecv,1024,0,(SOCKADDR*)&addr_from,&len);
dp=(DATAPACKAGE*)m_pRecv;

switch(dp->dataType)
{
case TEXTINFO:    //文本信息
p=m_pRecv+sizeof(dp);
m_strRecvText=m_strRecvText+p+"\r\n";
UpdateData(FALSE);
break;
case AUDIOINFO:  //音频信息
break;
}
        }
}套接字是个多播套接字,当发送不带数据结构的信息时 可以收到 并显示出来 可是当发送带数据结构信息的时候 可以收到数据结构这部分信息 后面的文本信息字节流确收不到 为什么啊?

解决方案 »

  1.   

    接受的时候应该要用循环来接收比如:
        int nTotalsize = 1000;
       while(nTotalsize > 0)
    {   int nsize = recv(buf, size0f(buf), 0);   nTotalsize -= nsize;
    }
    这样处理 原因是因为, 网络情况不好的时候 数据包被分块发送了.
      

  2.   

    上面掉了点
       while(nTotalsize > 0) 
    {    int nsize = recv(buf, size0f(buf), 0); 
       buf = buf + nsize;
       nTotalsize -= nsize; 
    }