服务端和客户端已建立连接
现在我有一个链表CList<CString, CString&> CodeList;
CodeList链表中保存了若干数据, 现在我想将这个链表从服务端发送给客户端
改怎么发送呢? 用Send?? 如果要发送结构体又该怎么发送?

解决方案 »

  1.   

    Socket发送数据必须是连续的数据块,想办法把链表中的数据放到一个连续的缓冲区
      

  2.   

    CString str;
    POSITION pos = CodeList.GetHeadPosition();
    while(pos)
    {
      CString strData = CodeList.GetNext(pos);
      str+= strData;
    }
    上面是把数据全连接在一起,保证数据连续,下面是发送数据
    send(s,str.GetBuffer(0),str.GetLength(),0);
    如果你要保证对方收到也是一个链表的话,你得自己定义协议了.
      

  3.   

    更不会了.. 
    我用for试着发过, 但接收的时候,数据却自己整合了...
    for( int i = 0; i < nCount; i++ )
    {
     m_OnlineList.GetText(i,strOnline);
     if( send(Online_sock, strOnline,strlen(strOnline),0) == SOCKET_ERROR )
     {
     AfxMessageBox("在线用户信息发送失败!");
     return TRUE;
     }
    }
    //将数据 "111111", "222222", "333333", "444444"通过send发送过到客户端 if( WM_SOCKET_MSG == pMsg->message )
    {
    char buf[1024];
    switch( pMsg->lParam )
    {
    case FD_READ:
    {
    int nlen =  recv(m_Client, buf, sizeof(buf),0);
    buf[nlen] = 0;
    AfxMessageBox(buf);
    }
    break;
    }
    }
    //接受的时候数据是"111111222222333333444444", 1次接受了数据,而不是分4次接受的...
      

  4.   

    如果你不考虑效率的话,你可以在for中加入sleep(100);这样可以有效的解决粘包
      

  5.   

    多谢jason_wentzel  我出现的问题因该就是粘包吧~!
    在程序里我必须考虑效率,所以不能加延时... 
    如果需要自定义协议..能给个例子吗? 一段代码也好
      

  6.   

    CString str;
    POSITION pos = CodeList.GetHeadPosition();
    while(pos)
    {
      CString strData = CodeList.GetNext(pos);
      str+= strData;
      str += "一个特殊的字符串";
    } 接收方,根据那个特殊的字符串进行解析
      

  7.   

    特殊字符用什么才不会重复? 如果CodeList里保存的是用户输入的字符串
    我不能限制用户的输入, 那这个特殊字符应该是什么好??
      

  8.   

    提两种做法:
    1、用循环发送,每次取其中一个CString,先发字符串长度(DWORD变量),再发字符串数据。接收时也用循环,先接收字符串长度(DWORD变量),再根据长度接收后面的数据,然后构造CString对象,插入List。注意,每次接收到的数据很可能小于给出的缓冲区大小,要判断接收函数的返回值,如果收到的数据不足,应循环继续接收后面的数据。
    2、用循环发送,每次取其中一个CString,直接发送字符串,长度加1(把最后的\0一起发送),发送完毕后断开连接。接收时,先分配一个足够大的缓冲区,用循环连续接收,直到接收函数返回0为止,然后逐一提取字符串。
      

  9.   

    非常感谢jason_wentzel 和  cnzdgs 怎么做,已经知道了,
    现在我想知道用什么特殊符号才不容易被用户当字符串输入到这个链表中,
    如果用户将这个特殊符号输入到字符串中,肯定会影响我分解数据,
    所以想问下哪些特殊字符不容易被用户输入?
      

  10.   

    i don't know how to do it,too difficult