我使用的是winsock2.0,做法是让服务器端accept到客户端的connect后就创建一个线程,然后在线程中recv客户端send过来的消息,我想让这个线程能第一次接收到一种结构体,做相应的操作;然后第二次接收的是另一种结构体,做另一种操作,应该怎么做。
请高手指教。

解决方案 »

  1.   

    但是要注意,不能在结构体中包含CString等可以变长的数据类型。
      

  2.   

    typedef struct Yuan{
    int color;
    int x;
    int y;
    int r;
    }YUAN;
    YUAN yuan1;
    yuan1.color=1;
    yuan1.x=m_x;
    yuan1.y=m_y;
    yuan1.r=m_r;YUAN *p;
    p=&yuan1;
    CSocket m_hSocket;
    m_hSocket.Create(2330,SOCK_DGRAM);
    m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用结构体发送。
    接收:void CSocket::OnReceive(int nErrorCode) 
    {
    char buff[256];
    int ret=0;
    ret=Receive(buff,256);
    if(ret==ERROR)
    {
    TRACE("ERROR!");
    }
    else 
    {
                YUAN *p=(YUAN *)buff; //还原为结构体类型
       int a=p->x;        //分别取值
                int b=p->y;
       int c=p->r;
       int colors=p->color;
             }
    CSocket::OnReceive(nErrorCode);
    }
      

  3.   

    我是要传两种不同的结构体。不知道服务器端应该怎么编程来分辨它们的信息。
    struct fileinfo
    {
          int fileno;
          int type;
          long len;
          int seek;
          char name[100];
    };
             fileinfo fileinfo1;
             fileinfo1.len=filerange[index*2+1
    fileinfo1.seek=filerange[index*2];
    fileinfo1.type=2;
    fileinfo1.fileno=doinfo.threadno;
    connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
             sendn(m_socket,(char*)&fileinfo1,100);        struct filesendinfo
           {
    char name[100];
    int length;
    int date;
           };
           filesendinfo zmfile[10];
           connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
           sendn(m_socket,(char*)zmfile,1080);
    服务器端在accept()后应该怎么做才能分辨出send过来的是fileinfo结构还是filesendinfo。请大家帮忙。
      

  4.   

    你在结构体中加一个标识字段不就可以了,
    或者你定义一个虚基类,两个结构体都是派生的,要有一个虚函数,例如getClassName();
    class base{
    public:
       char      ClassName;
       virtual char getClassName()const;
    };class Drive1:public base
    {
       getClassName(){return 1;}
    }class Drive2:public base
    {
       getClassName(){return 2;}
    }最好的方法还是在结构中定义字段
      

  5.   

    但结构体的大小不同的,sendn的最后一个参数应该怎么设置呢?
      

  6.   

    ddgfei(不懂规矩) 说在结构体里定义一个标识字段,但因为两种结构体的大小是不同的,所以send()函数的最后一个参数即结构体的大小应该怎么设置呢?
      

  7.   

    如果使用强制转换,你就必须将结构体的字节编排好。例如两个结构体
    struct 1{
       char   bianhao;
       char   name;
       char   neirong[100];
    }struct 2{
       char bianhao;
       char dabian[1000];
    }
    哈哈…………说的狗清楚了吗?
      

  8.   

    如果使用类的方法,必须对这些字符段实行interpret_cast<>方法。看你对C++和C的熟悉程度。
      

  9.   

    你可以定义一个结构体,在这个结构体中包含你要传输的所有不同结构体的变量。然后在结构体中设置一个整型变量来区分不同的信息类型。当接收到一个结构体时,先读取他的整型变量,然后再执行相应的操作如:typedef struct temp {
    BYTE flag;
    char name[15];
    char password[12];
    char Message[180];
    bool success;
    //temp* Next;
    }Msg;收到消息时:
             Msg msg1;
    buffer[nLen]=NULL;
    memcpy((void*)&m_msg,buffer,nLen);
    switch(m_msg.flag) 
    {
    case 0: {//登陆信息
    msg1 = LandResult();
    //if(m_ServerSocket.m_pHead->m_pNext)
    SendToClient(m_ServerSocket.m_pHead,msg1);
    }
    break;
    case 1: SendToClient(m_ServerSocket.m_pHead,m_msg);
    break;
    // case 2: SendToClient(m_ServerSocket.m_pHead,m_msg);
    // break;
    case 3: SendToClient(m_ServerSocket.m_pHead,m_msg);
    break;
    default:
    break;
    }