我自己设计了一个结构,如下:
typedef struct _trp{
… …
ULONG  bufferLength;
PVOID buffer;
… …
}TRP,*PTRP;
我想在主机上通过socket传输一块数据到另一台机器上(客户端),UCHAR* buffer=(UCHAR*)malloc(50);
CString str=_T(“This is a test!”);
ULONG len=strlen(str);
memcpy(buffer,str,len);TRP trp;
trp.bufferLength=len;
trp.buffer=buffer;
然后我用socket发送:
pSocket->send(&trp,100);
在接受端可以接收到,但是传来的字符串怎么也显示不出来,不知道是不是传过来的只是个指针,相应的内容没有传过来。
写得比较罗嗦,希望能看明白!在线等待!

解决方案 »

  1.   

    你本来就没有把 buffer 指向的内容发送过来。你可以使用这样的结构来定义
    typedef struct _trp{
    … …
    ULONG  bufferLength;//缓冲区长度
    PVOID buffer[0];//缓冲区
    }TRP,*PTRP;CString str=_T(“This is a test!”);
    int len = sizeof(TRP) + strlen(str) + 1;
    PTRP  pTrp = (PTPR)malloc( len );//...
    pTrp->bufferLength = strlen(str) + 1;
    memcpy(pTrp->buffer,str,pTrp->bufferLength);然后用 socket 发送  pTrp 指向的地址的内容, 长度为 len, 如
    send(sock, pTrp, len, 0);接收方受到后可以直接使用 buffer 指向的字符串。不过接收方要分配足够的内存!最好是结构中不含有指针,
      

  2.   

    最好是结构中不含有指针,如下typedef struct _trp{
    … …;  //其他指示变量,如结构类型标识
    ULONG  length;//缓冲区长度
    }TRP,*PTRP;每次发送,先发送一个上面的结构,然后发送 length 个 字节 长度的数据。这样,如果有多个不定长度的区域,可以使用多个结构。接收方根据结构标
    识对随后的数据进行解释。例如 gif 文件的格式就是这样作的。
      

  3.   

    如果一定要使用指针,那就需要特别的处理。因为指针在这台机子和那台机子上指向的内容是不同的。你需要拷贝指针指向的数据,然后根据接收方存放数据的位置修正结构中的指针变量的值。可以使用 RPC (远程过程调用)来完成, RPC 可以完成这些。
      

  4.   

    谢谢逸少兄(应该是位兄台吧),我之所以在一个结构中包含指针,是为了使各个发送的数据包有统一的形式,便于处理。
    pTrp->bufferLength = strlen(str) + 1;这里的“+1”是什么意思?如果不是字符串就可以不用“+1”了吧?
      

  5.   

    FAQ:
    每次发送,先发送一个上面的结构,然后发送 length 个 字节 长度的数据。这样,如果有多个不定长度的区域,可以使用多个结构。接收方根据结构标
    识对随后的数据进行解释。这样后来发送的数据不会丢失吧?
    如果数据量比较大,我担心有些数据包会丢失,请教!
      

  6.   

    一般情况我认为用TCP进行传输,可以保证,数据的完整,传输次序准确,
    在发送端没有必要做太多的处理,在接收端每次接收的数据量是不一样的,
    只要能保证每次接收到的数据是发送端口的结构的大小,在将接收到的数据
    转化成相应的结构指针即可。如果有很多个结构传输,可以先传输一个标示
    符,在接收端先接收这个标示符,然后再确定结构的长度。
      

  7.   

    下面是我接收端的一段:do
    {
    offset = 0;
    re = recv(m_sock, nType, 1, 0);
    if(re == 0)
    break;
    switch(nType[0])
    {
    case ADD_USER:
    nLen = sizeof(struct CUserInfo);
      break;
    case USE_LOG:
    nLen = sizeof(struct CUserLog);
      break;
    case MSG_SEND:
    nLen = sizeof(struct CUserMsg);
    break;
    default:
    printf("else Len :%d\n", nLen);
    continue;
    break;
    }
    pmsg = new char[nLen];
    re = recv(m_sock, pmsg, nLen, 0);
    if(re > 0)
    {
    offset += re;
    while(nLen != re)
    {
    nLen -= re;
    re = recv(m_sock, pmsg + offset, nLen, 0);
    if(re <= 0)
    {
    printf("read over\n");
    delete pmsg;
    goto Ex;
    //break;
    }
    offset += re;
    }

    PeekMsg(nType[0], pmsg);
    }
    delete pmsg;
    }while(re > 0);Ex:
    shutdown(m_sock, SD_RECEIVE);
    }
      

  8.   

    谢谢楼上诸兄!我对理解不深,担心数据丢失,闹出笑话,该打!
    glhorse(happy day)兄的代码很有帮助,多谢指点迷津!又及:
    所定义的结构中,
    PVOID buffer[0];//缓冲区
    一句,编译时通不过,提示:zero-sized array in struct/union
    非要这样定义吗?为什么要用0作为维数?怎样使编译能通过?这一贴给的分太少,待会儿再开一贴,诸位兄台一定记着去领分!
      

  9.   

    谢谢楼上诸兄!我对TCP理解不深,担心数据丢失,闹出笑话,该打!
    glhorse(happy day)兄的代码很有帮助,多谢指点迷津!又及:
    chzy00(逸少)兄所定义的结构中,
    PVOID buffer[0];//缓冲区
    一句,编译时通不过,提示:zero-sized array in struct/union
    非要这样定义吗?为什么要用0作为维数?怎样使编译能通过?这一贴给的分太少,待会儿再开一贴,诸位兄台一定记着去领分!
      

  10.   

    PVOID buffer[0];//缓冲区只是定义一个指向指针的指针罢了,PVOID* buffer也行。
      

  11.   

    http://www.csdn.net/expert/topic/1069/1069321.xml?temp=.220669大家到这儿去领分呀,我要结帖了