我在服务端传送以下结构体:
typedef struct SvMsg
{
int i;
char name[15][21];
char message[15][151];
}svMsg;
由于这个结构体大于1514个字节,在传送的时候被截成了两部分,接收的时候recv()执行了两次,怎么再组合出上面的结构体呢?

解决方案 »

  1.   

    //直到收完为止,你自己加入出错处理
    int n = sizeof(SvMsg);
    while(n != 0)
    {
       int rcvnum = recv();
       n -= rcvnum ;
    }
      

  2.   

    new byte[1514]
    memcpy
    强转
    delete []
      

  3.   

    if(recv(ClientSocket,(char *)&servermsg,sizeof(servermsg),0) == SOCKET_ERROR)
    {
    AfxMessageBox("½ÓÊÕÊý¾Ý·¢Éú´íÎó¡£");
    return 0L;
    }
      

  4.   

    我是这么写的:
    if(recv(ClientSocket,(char *)&servermsg,sizeof(servermsg),0) == SOCKET_ERROR)
    {
    AfxMessageBox("接收数据错误!");
    return 0L;
    }
    servermsg是一个svMsg的结构体,可就是不行,每次能处理的只是最后一个包!
      

  5.   

    不是new过了byte[1514]
    每收到一个包就memcpy
    然后强转new的并memcpy好的指针
    最后delete
    ok
      

  6.   

    那是你方法的不对,TCP是接收的是流,没有消息边界的,一次recv不保证接受到的是完整消息,也有可能接收到多条消息。你可以这样写:
    int i = 0;
    for(;;){
      int len = recv(ClientSocket, (char*)&msg + i, sizeof(msg) - i, 0);
      if(len == SOCKET_ERROR)
        return 0;
      i += len;
      if(i == sizeof(msg))
        return &msg;
    };
      

  7.   

    Analyst() 不对啊!第一次接收就有错误!
      

  8.   

    char *pms;
    pms=(char*)Malloc(sizeof(svMsg))
    if(!pms)错误处理
    int i=0;
    int len;
    while((len=recv(s,pms+i,sizeof(svMsg)-i,0))>0 && i<=sizeof(ms)){
        i+=len;
    }
    if(len<0)错误处理
    hehe:)我没有调试,你试试吧。应该没有问题的