所有的client登陆到server中,登陆时发送client的信息,包括用户名和ip和port!
m_pDoc->UserInfo[i].Name   = RecvMess[i].Name;
m_pDoc->UserInfo[i].IPAddr = RecvMess[i].IPAddr;
m_pDoc->UserInfo[i].Port   = RecvMess[i].Port;
m_pDoc->UpdateAllViews(NULL, 0L, 0);RecvMess[i] 是接收到的信息,UserInfo[i]是server端保存的用户信息,保存在mfc的doc类中!然后server想把这些信息发给某一个clientfor (int j = 0; j < MAXClient; j++)
{
   if(m_aClientSocket[j] != INVALID_SOCKET)
   {
      m_pDoc = GetDocument();
      RecvMess[j].Name         = m_pDoc->UserInfo[j].Name;
      RecvMess[j].IPAddr       = m_pDoc->UserInfo[j].IPAddr; 
      RecvMess[j].Port         = m_pDoc->UserInfo[j].Port;      int iErrorCode = send ( m_aClientSocket[i], (char *)&RecvMess[j],  // 发给客户端i
      sizeof(RecvMess[j]), NO_FLAGS);
      if (iErrorCode == SOCKET_ERROR)
 ReportWinsockErr("客户端没有响应");
    }
}问题来了,当只有一个客户端登陆时,完全ok!
但是当两个客户端登陆时,就总是说内存无法访问?(对于不同的客户端用不同的socket连接tcp)
断点调试 
RecvMess[j].Name         = m_pDoc->UserInfo[j].Name;
此句总是通不过,为什么啊,急!是不是涉及到进程之间通信的问题呢?

解决方案 »

  1.   

    UserInfo是怎么初始化的?
    是不是数组?
      

  2.   

    对!是数组,在构造函数中初始化的!for(int i = 0; i < MAXClient; i++)
      {
      UserInfo[i].TName   = "";
          UserInfo[i].IPAddr = 1;
      UserInfo[i].Port   = 1;
      }
      

  3.   

    UserInfo是怎么定义的,肯定是这个的问题。
    你把定义贴出来看看。
    再告诉你怎么做
      

  4.   

    他的TName好象是CString的,发送结构的时候不能用这个类型吧。
    用char TName[128];这样的。
    CString是动态分配的,所以结构的大小不定。
    发送会有问题
      

  5.   

    呵呵,这里的TName是string定义的!
    发送结构的时候,强制转换了,而且只有一个客户端的时候完全ok!
    为什么当第二个客户端连接上时,就总是无法读去呢?奇怪!#ifndef tini_2005_1_header_h#define tini_2005_1_header_h#define CTOS    0
    #define STOC    1
    #define CTOC    2
    #define BROD    3#define CTOSReg 4
    #define CTOSRef 5
    #define STOCRef 6struct sendMessage
    {
    int iMessageType;
    u_short Port;
    CString Name;
    DWORD   IPAddr;
    union _message
    {
    char  mText[1024];
    char  mCtrl;
    }message;};struct User
    {
    CString Name;
    DWORD   IPAddr;
    u_short Port;
    };#endif
      

  6.   

    struct User UserInfo[MAXClient];   定义在doc类的头文件里!
      

  7.   

    RecvMess[j]  是传递的引用还是值
      

  8.   

    传的时候是地址,强制转换成(char *),但应该不是这个问题!
      

  9.   

    我觉得pclili(黑客天使)说的对,首先你不要用CString类来发送消息,修改为char定长的数组
    要注意修改后服务器端存储的时候要用strcpy,直接等于会有问题
      

  10.   

    数组用定长的char []
    拷贝用strcpy或memcpy
      

  11.   

    这个我也试过了,换strcpy也不行,会不会是两个线程同时访问同一个地址的数据造成冲突呢?
      

  12.   

    问题似乎找到了,可能是因为我发送的的数据太长了,一次recv()接收不完,于是接收了两次!
    第二次的时候,没有处理,而另外一个进程也recv()正好访问同一个地址空间,于是出现错误!
    把char  mText[1024]中的1024改成512,问题好象解决了!但是客户端好象不能协调工作,也就是同时多开几个客户端时,相互和server通信,好象总有个别客户端出错,难道这就是tcp的原因?
      

  13.   

    贴出书上的一点东西,大家共同学习!必须牢牢记住这一点:所有关系到收发数据的缓冲都属于简单的c h a r类型。也就是说,这
    些函数没有“U n i c o d e”版本。这一点对Windows CE来说尤为重要,因为Windows CE默认使
    用U n i c o d e。使用U n i c o d e时有一种选择,即把字符串当作c h a r *或把它造型为c h a r *发送。需要
    注意的是,在利用字符串长度函数告诉Winsock API函数收发的数据有多少字符时,必须将这
    个值乘以2,因为每个字符占用字串组的两个字节。另一种选择是在将字串数据投给Wi n s o c k
    A P I函数之前,用Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。