现在有一个结构体:
比如说
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; //释放
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你要的二进制再发