m_MulticastSocket.SendMsg()函数大致如下:
bool CMulticast_Socket::SendMsg( CString strSendMsg )
{
char strMsg[MEETING_MSG_BUFFER_SIZE];

    strcpy ( strMsg , strSendMsg.GetString() );
 
    if( m_SendSocket.SendTo(&strMsg , sizeof(strMsg) , (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) == SOCKET_ERROR )
return false;

return true;
}程序使用的是CAsyncSocket类,并使用WinSock1.1的多播。我的程序大致如下:  if( m_MulticastSocket.IsJoined() == false )
  return;  char strMsg[MEETING_MSG_BUFFER_SIZE];  memset( &strMsg , 65 , MEETING_MSG_BUFFER_SIZE ) ;  m_MulticastSocket.SendMsg( strMsg );  m_MulticastSocket.SendMsg( strMsg );  m_MulticastSocket.SendMsg( strMsg );  m_MulticastSocket.SendMsg( strMsg );MEETING_MSG_BUFFER_SIZE 为 8000;状况:只能发出头两个数据,如果使用循环来进行发送,在发送第一个数据时就报内存冲突。不知道有没有人遇到过这种情况。

解决方案 »

  1.   

    首先你的函数定义应该改为:
    bool CMulticast_Socket::SendMsg( char * strSendMsg, int strlen )
    {
    char strMsg[MEETING_MSG_BUFFER_SIZE];

        memcpy ( strMsg ,strSendMsg,strlen  );
         //不要使用strcpy,strcpy只能copy字符串 
        if( m_SendSocket.SendTo(&strMsg , strlen , (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) == SOCKET_ERROR )
    return false;

    return true;
    }另外,不要使用sizeof对字符串求值.
      

  2.   

    另外,应该判断sendto是否成功,然后继续发送.不是简单判断返回值.
      

  3.   

    注意你的代码:if( m_MulticastSocket.IsJoined() == false )
      return;  char strMsg[MEETING_MSG_BUFFER_SIZE];  memset( &strMsg , 65 , MEETING_MSG_BUFFER_SIZE ) ;  m_MulticastSocket.SendMsg( strMsg );你先填写局部缓冲区为 65 后,没有直接在后面天加 '\0'
    这是很要命的。注意你的实现函数原型: SendMsg( CString str )
    调用时候,存在一个从 char* 到 CString 的默认转换
    这个转换会访问你的
      char strMsg[MEETING_MSG_BUFFER_SIZE];
    你的缓冲区没有结尾标记,那么 CString 会一直访问到 strMsg 的边界以外的地方,自然存在非法内存访问。代码的其他地方可能也值得推敲。
      

  4.   

    strMsg没有结束标记'\0'。
    这句是初始化还是赋值?
    memset( &strMsg , 65 , MEETING_MSG_BUFFER_SIZE ) ;
    若是初始化应将65改为0;若是赋值应加一句
    strMsg[MEETING_MSG_BUFFER_SIZE - 1] = 0;
      

  5.   

    1 to wuxuan(真心英雄)
      另外,应该判断sendto是否成功,然后继续发送.不是简单判断返回值.
      >>应该怎样判断呢?2 anyiflyer(西门吹雪)
      我觉得应该在每次发送后先判断是否发送成功,而且两次发送之间应该有时 
      间间隔.
      >>我有时间间隔,server发17308次,client收17308次,很对。
      >>但时间太长了。有没有改进的好方法?