从客户端发送X,Y,Z坐标信息到服务器,服务器在收到这些数据之后把它传给其它客户端,其它客户端怎样获取这些坐标数据呢,也就是怎样解析或翻译这些数据。
我在做一个小的游戏实例,但在服务器把数据传给客户端之后,不知道怎么处理、解析。

解决方案 »

  1.   

    怎么发的就怎么收呀?用了结构体?
    typedef struct pos
    {
    int x;
    int y;
    int z;
    } point;
    point p[100];
    char buff[1000];
    //比如每次发10个
    int len = sizeof(point)*10;
    memcpy(buff,p,len);
    serversocket.Send(buff,len);
    ...
    //接收
    clientsocket.Receive(buff,len);
    memcpy(p,buff,len);
      

  2.   

    这个就是你自己定义的【协议】。
    x y z 三个坐标,假如使用 int 变量来存储的话,那么就是 12 个字节;就像 1 楼说的,把它们定义为一个结构体,然后发送;收到后,然后按顺序一个个取出来即可。你自己试着写写看,遇到具体问题再来问。
      

  3.   

    LZ
    LS的诸位仁兄都已经讲得很清楚了呢 
    如果你对OSI通讯协议层了解一点儿的话
    其实都是定义好数据机构进行组包 解包的 
      

  4.   

    void InitKeyboard(HINSTANCE hInstance){//初始键盘设备、、、 DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(LPVOID*)&g_pInput,NULL);
    g_pInput->CreateDevice(GUID_SysKeyboard,&g_pInputDevice,NULL);
    g_pInputDevice->SetDataFormat(&c_dfDIKeyboard);
    g_pInputDevice->SetCooperativeLevel(hWnd,DISCL_NONEXCLUSIVE|DISCL_FOREGROUND|DISCL_NOWINKEY);
    g_pInputDevice->Acquire(); }
    int ReadKeyboard()//获取按键
    {
    int key=0;
    g_pInputDevice->GetDeviceState(sizeof(g_state),g_state);
    if(0x80&g_state[DIK_RIGHT])
    key=4;
    if(0x80&g_state[DIK_LEFT])
    key=3;
    if(0x80&g_state[DIK_UP])
    key=1;
    if(0x80&g_state[DIK_DOWN])
    key=2;
    return key;

    }
    .......
    switch (ReadKeyboard()){ case 3:{x--;break;}
    case 4:{x++;break;}
                    case 1:{z--;break;}
    case 2:{z++;break;}
    }
    用TCP通信怎样获取其中按的键,
    #include "stdafx.h"
    #include "winsock.h"WSADATA wsaData;     // 初始化WSA时使用
    SOCKET s;         // socket
    SOCKADDR_IN ServerAddr; // 服务器地址
    int Port=9000;    // 服务器端口int _tmain(int argc, _TCHAR* argv[])

            WSAStartup(MAKEWORD(2,2),&wsaData) ; //启动winsock的库;
        s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ; //初始化socket

    ServerAddr.sin_family=AF_INET;
    ServerAddr.sin_port=htons(Port);
    ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
                connect(s,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
                send(s,"From a client",13,0);
        while(1){          
    char buf[256];
    memset(buf,0,sizeof(buf));
    scanf("%s",buf);
    send(s,buf,sizeof(buf),0);
    memset(buf,0,sizeof(buf));
    recv(s,buf,sizeof(buf),0);
    printf("%s\n",buf);
    }    
        closesocket(s);//关闭socket,关闭WSA
            return 0;
    }
      

  5.   

    如果对性能要求不高,可以考虑直接用CSocket类,并配以一个可以序列化的类(该类中包含了你的X、Y、Z成员)来实现。
    这样的好处是,你想把你的类发送到SOCKET,就向CSocket去序列化;你想把你的类存到文件,就向CFile去序列化。总之,有了序列化,想往哪里存都OK。
      

  6.   

    我做的是将游戏中小动物移动时产生的坐标信息,传到一个服务器,服务器把数据传回,在客户端调用函数使小动物移动。通信用的是TCP、SOCKET,程序语言C++,对等的C/S结构。知道的说一下,先谢谢了,如果问题在今天内解决可以加50分。