我用socket练习作一个简单的聊天工具,服务器端用CList保存了当前在线用户列表,CList的模板参数为一个结构体,结构体中保存了用户的IP,端口等信息,我想把这个CList发送给客户端,在服务器端,我是直接
send(&UserList,sizeof(UserList)),然后在客户端,声明了一个CList对象,receive(&UserList,sizeof(UserList)),但是客户端接收不成功,客户端的接收我感觉是有问题的,我想请教一下,如何把这个列表发送给客户端并让客户端接收这个CList?

解决方案 »

  1.   

    这样应该不行吧,UserList里只要有指针变量,到对端都是无效的啊。
    建议在服务器端将所有用户信息用特殊的分隔符(如'\xFF')拼成一个字符串,然后发送给客户端。客户端再根据这个分隔符拆分得到
      

  2.   

    方法:
    1、自定义个结构体,使用简单数据类型如char[]、int等,里面保存用户信息再定义个结构体数组,把数据全部保存在数组里面,最后把整个数组中的数据发送过去就OK了
    2、把用户消息写在XML里面,然后发送过去
    3、用Google的Buffer也不错
    4、用Matrix_Designer的方法也行,我第一次传送文件列表时也是用这种方法的
      

  3.   

    强人,其实不用那么麻烦吧,就把你的结构休转换成char* ,然后发送过去,到那边再转换回来应该没错的。
      

  4.   


    这个似乎不行,请见:
    《郁闷了!写socket时,无法将结构体转换成char*发送》
    http://topic.csdn.net/u/20100915/22/6e045577-34cc-4280-ab28-537ca21800bc.html?94786
      

  5.   

    恩 是啊
     增加一个头文件  放结构体
     struct customer
    {
    int port;
    char ip[];
    }在要发送的CPP中
    customer  buf;
    memset(&buf,0,sizeof(buf));
    buf.port=......;
    buf.ip=........;
    sendto(socket,char* buf,len);
    不知道能不能帮到你
      

  6.   

    // 下面这段代码也许可以帮帮你,可以调试调试
    #pragma pack(1)
    typedef struct client
    {
    unsigned short port;
    long ip;
    } client;typedef struct users
    {
    int len;
    int count;
    client user[1];
    } users;#pragma pack()CList<client, client> clients;// 服务器端代码:        client clt;
    clt.ip = inet_addr("127.0.0.1");
    clt.port = htons(8000);
    clients.AddHead(clt); clt.ip = inet_addr("192.168.1,10");
    clt.port = htons(8000);
    clients.AddHead(clt); int nCount = clients.GetCount();
    if(nCount==0)
    return; int len = sizeof(users)+(nCount-1)*sizeof(client);
    users * pUsers = (users *)malloc(len);
    if(pUsers==NULL)
    return; pUsers->len = len;
    pUsers->count = nCount; POSITION pos;
    pos = clients.GetHeadPosition();
    int i=0;
    while (pos)
    {
    client clt = clients.GetNext(pos);
    pUsers->user[i].ip=clt.ip;
    pUsers->user[i].port = clt.port;
    } send(m_socket,(char *)pUsers,len,0);
    free(pUsers);
    客户端代码:
    // users * pUsers = (users *)malloc(len);
    pUsers = (users *)malloc(2000);
    recv(m_socket,(char *)pUsers,sizeof(users),0); // 接收第一个客户地址 if(pUsers->count==1)
    return TRUE;
                                            // 接收其它客户地址
    recv(m_socket,(char *)(&pUsers->user[1]),pUsers->len-sizeof(users),0);
    for( i=0; i<pUsers->count; i++)
    {
    TRACE("IP[i]=%08X,PORT[i]=%d\n",i,pUsers->user[i].ip,pUsers->user[i].port);
    }
      

  7.   

    将list中的一个个的信息解析出来,放到一个buffer中发送,然后每个用户中间有一个特殊的分界符。
      

  8.   

    需要做两个操作:
    (1)发送端将结构体写到char型buffer中;
    (2)接收端将接收到的char型buffer数据转化为结构体。
    -----------------------------
    可以考虑使用tinyXML将结构体数据转化为xml数据,然后再发送,接收端接受到xml数据后,按tinyXML方法解析一下即可得到对应的结构体数据,即写两个函数,一个是用于组xml包的函数,一个是用于解析xml包的函数。
      

  9.   

    在我们的平台平台软件中,客户端和服务器交互的数据通信都是使用tinyXML实现数据传输的,只需要写一个用于组包和解包的类就可以了,对外暴露解包和组包的方法。