Send发送结构体的小疑问?

C++语言 码拜 9年前 (2015-10-08) 1462次浏览

现在有一个结构体:
比如说 
struct Sendbuf
{
    char Datebuf[100];
};

发送:
Sendbuf sendbuf;
memset(sendbuf.Datebuf,0,sizeof(sendbuf.Datebuf)/sizeof(char));
strcpy_s(sendbuf.Datebuf,strlen(“Think you”)+1,”Think you”);

然后把sendbuf这个结构体发送过去之后,是没有问题的。

假如我把Datebuf改成一个char指针,如下
struct Sendbuf
{
    char *Datebuf;
}
发送:
Sendbuf sendbuf;
sendbuf.Datebuf = new char[100];   //因为发送的内容是不固定的,有可能大于51200所以用new
strcpy_s(sendbuf.Datebuf,strlen(“Think you”)+1,”Think you”);
然后Send发送这个结构体,接收方得到的是一串乱码,

这是何原因啊,求解。

方案推荐指数:5
修正一下

struct Sendbuf
{
    char Datebuf[1];
};
char * lpSendBuff = new char[100];
Sendbuf* sendbuf = (Sendbuf*)lpSendBuff ;
strcpy_s(sendbuf.Datebuf,strlen("Think you")+1,"Think you");
方案推荐指数:10
struct Sendbuf
{
    int  encode;
    int encrypt;
    char *Datebuf;
};
Sendbuf sb = {3, 4, "abcde"};
char* psend = new char[1024];
memset(psend, 0, 1024);
void* pstart = (void*)psend;
*(int*)pstart = sb.encode; pstart += 4;
*(int*)pstart = sb.encrypt; pstart += 4;
strncpy((char*)pstart, sb.Datebuf, strlen(sb.Datebuf));
int len = 4+4+strlen(sb.Datebuf);
send(socket, psend, len, 0)
方案推荐指数:10
要一次发送的话用13楼说的变长数组
struct Sendbuf
{
    int  encode;
    int encrypt;
    char databuf[];
};  
int len = 1024; //databuf 长度
Sendbuf* buf =(Sendbuf*)new char[sizeof(Sendbuf) + len]; //申请空间
strcpy(buf->databuf, “hellow”);
send(socket, (char*)buf, sizeof(Sendbuf) + len, 0);
delete[] buf; //释放
方案推荐指数:3
帖主考虑两边机器的字节对齐设置不一样了吗?

void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,(""!""<buf[j]&&buf[j]<=""~"")?buf[j]:""."");
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,(""!""<buf[j]&&buf[j]<=""~"")?buf[j]:""."");
        }
        printf("%s\n",binstr);
    }
}

有时调试socket不抓包是解决不了问题的。

方案推荐指数:2

你要不是发送定长数组而是指针的话,那么强转const char*后,内存里头那个值只是一个内存地址而已,指向的内容跟你结构体之间的内容并不连续,当然发不出了。
你要么定长,要么重新设计协议,带个包长和偏移,写上一堆序列化和反序列化,省不了的别纠结了,没有什么简单的想当然的办法
要么你考虑用protocal buf,要么考虑用文本协议,base64你要的二进制再发


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Send发送结构体的小疑问?
喜欢 (0)
[1034331897@qq.com]
分享 (0)