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;状况:只能发出头两个数据,如果使用循环来进行发送,在发送第一个数据时就报内存冲突。不知道有没有人遇到过这种情况。
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;状况:只能发出头两个数据,如果使用循环来进行发送,在发送第一个数据时就报内存冲突。不知道有没有人遇到过这种情况。
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对字符串求值.
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 的边界以外的地方,自然存在非法内存访问。代码的其他地方可能也值得推敲。
这句是初始化还是赋值?
memset( &strMsg , 65 , MEETING_MSG_BUFFER_SIZE ) ;
若是初始化应将65改为0;若是赋值应加一句
strMsg[MEETING_MSG_BUFFER_SIZE - 1] = 0;
另外,应该判断sendto是否成功,然后继续发送.不是简单判断返回值.
>>应该怎样判断呢?2 anyiflyer(西门吹雪)
我觉得应该在每次发送后先判断是否发送成功,而且两次发送之间应该有时
间间隔.
>>我有时间间隔,server发17308次,client收17308次,很对。
>>但时间太长了。有没有改进的好方法?