C++socket如何处理接到的bytes类型的数据

时间:2021-03-01 11:45:29
我的客户端是用C#把要发的信息把转化成了bytes类型了.我用的C++
接收到的
recv(socket,recvBuffer,1024,0))
recvBuffer为char * 怎么才能取到我发送的值呢?

21 个解决方案

#1


定义个包头,指明数据段的长度。然后先收包头,根据包头接受数据段的数据~~

#2


接收到的数据都是二进制的,你认为它是什么就是什么。
当然不能乱来。

#3


C++用unsigned char

#4


引用 2 楼 freezezdj 的回复:
接收到的数据都是二进制的,你认为它是什么就是什么。
当然不能乱来。

再详细点呀!

#5


引用 1 楼 hastings 的回复:
定义个包头,指明数据段的长度。然后先收包头,根据包头接受数据段的数据~~

这个已经定义好了.主要是接收的是二进制的.我怎么才能把它转换成字符呢?

#6


C++用unsigned char
你应用层收到的已经是 字节类型了。
你先接收包头,然后判断包体是否分包
包体有多长。
然后使用 recv 继续接收包体的内容。

当然一定要考虑制定的协议来处理你收到的内容

#7


上一下我的代码吧.还不行呀

void DealData(char* recvBuffer)
{
char res[5];
memcpy(res,recvBuffer,4);
res[4]=0;
printf("%s",res);
}

我客户端定义好了.包头是4个字节.它用它来定义总长度.可得到的确实什么看不懂的东西!能不能再详细一点.对这真是太不懂了!

#8


学习。

#9


你这个是C++的代码吧?

#10


放在一个FIFO队列中

#11


发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

#12


void DealData(char* recvBuffer)
{
    int res, t;
    memcpy(&t,recvBuffer,4);
    res = ntohl(t);
    printf("%d",res);
}

#13


引用 11 楼 mudunke775 的回复:
发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

可是我的客户端不是c++的.它用的是C#.并且把传送的数据转化成了字节流!

#14


这个...
char 和 byte 在二进制层面会有区别吗,都是8个位而已。

你把recv之后的缓冲区内的数据看成(byte)类型的就行了呗。

#15


引用 13 楼 qiuqingpo 的回复:
引用 11 楼 mudunke775 的回复:

发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

可是我的客户端不是c++的.它用的是C#.并且把传送的数据转化成了字节流!


对啊,你只要知道他的字节流协议就行啊,按BYTE处理一样的啊

#16


嗯.是的.谢谢大家.

void DealData(char* recvBuffer)
{
    int  t;
    memcpy(&t,recvBuffer,4);
printf("%d\n",t);
}
我是int型.只有这样才能得到.尤其是谢谢justkk

#17


struct mydata{
int a;
long b;
char c[8];
};

recvBytes[1024];
recv...;

mydata* pdata=(mydata*)recvBytes;
printf(...pdata->c)

#18


定义个unsigned char  或 BYTE 数组,传进去即可。
感觉楼主是学JAVA或C#,数据类型都是宗教,脑子只要考虑 内存位置,读或写几个字节长度即可 

#19


引用 18 楼 zhujian888 的回复:
定义个unsigned char  或 BYTE 数组,传进去即可。
感觉楼主是学JAVA或C#,数据类型都是宗教,脑子只要考虑 内存位置,读或写几个字节长度即可

是的.怎么才能转变一下呢.我刚开始学C++.还请多指教

#20


怎么省略了ntohl()呢?那是处理整型的字节序的
将网络字节序转换为本机字节序,当不同类型的主机通信时非常必要..

#21


二进制的东西都是一样的
char从到unsinged char其实我所谓转换
C#和C++对接我做过
只要双方数据结构同意
协商好痛心协议就没有问题

#1


定义个包头,指明数据段的长度。然后先收包头,根据包头接受数据段的数据~~

#2


接收到的数据都是二进制的,你认为它是什么就是什么。
当然不能乱来。

#3


C++用unsigned char

#4


引用 2 楼 freezezdj 的回复:
接收到的数据都是二进制的,你认为它是什么就是什么。
当然不能乱来。

再详细点呀!

#5


引用 1 楼 hastings 的回复:
定义个包头,指明数据段的长度。然后先收包头,根据包头接受数据段的数据~~

这个已经定义好了.主要是接收的是二进制的.我怎么才能把它转换成字符呢?

#6


C++用unsigned char
你应用层收到的已经是 字节类型了。
你先接收包头,然后判断包体是否分包
包体有多长。
然后使用 recv 继续接收包体的内容。

当然一定要考虑制定的协议来处理你收到的内容

#7


上一下我的代码吧.还不行呀

void DealData(char* recvBuffer)
{
char res[5];
memcpy(res,recvBuffer,4);
res[4]=0;
printf("%s",res);
}

我客户端定义好了.包头是4个字节.它用它来定义总长度.可得到的确实什么看不懂的东西!能不能再详细一点.对这真是太不懂了!

#8


学习。

#9


你这个是C++的代码吧?

#10


放在一个FIFO队列中

#11


发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

#12


void DealData(char* recvBuffer)
{
    int res, t;
    memcpy(&t,recvBuffer,4);
    res = ntohl(t);
    printf("%d",res);
}

#13


引用 11 楼 mudunke775 的回复:
发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

可是我的客户端不是c++的.它用的是C#.并且把传送的数据转化成了字节流!

#14


这个...
char 和 byte 在二进制层面会有区别吗,都是8个位而已。

你把recv之后的缓冲区内的数据看成(byte)类型的就行了呗。

#15


引用 13 楼 qiuqingpo 的回复:
引用 11 楼 mudunke775 的回复:

发送的时候把发送的数据做成一个BUFFER,就是CHAR[],比如[15name1],第一位1表示是标识符,第二位表示后面数据的长度,然后读取5个CHAR,就是name1.
这种协议需要自己去定义的,根据你的需要自己定义

可是我的客户端不是c++的.它用的是C#.并且把传送的数据转化成了字节流!


对啊,你只要知道他的字节流协议就行啊,按BYTE处理一样的啊

#16


嗯.是的.谢谢大家.

void DealData(char* recvBuffer)
{
    int  t;
    memcpy(&t,recvBuffer,4);
printf("%d\n",t);
}
我是int型.只有这样才能得到.尤其是谢谢justkk

#17


struct mydata{
int a;
long b;
char c[8];
};

recvBytes[1024];
recv...;

mydata* pdata=(mydata*)recvBytes;
printf(...pdata->c)

#18


定义个unsigned char  或 BYTE 数组,传进去即可。
感觉楼主是学JAVA或C#,数据类型都是宗教,脑子只要考虑 内存位置,读或写几个字节长度即可 

#19


引用 18 楼 zhujian888 的回复:
定义个unsigned char  或 BYTE 数组,传进去即可。
感觉楼主是学JAVA或C#,数据类型都是宗教,脑子只要考虑 内存位置,读或写几个字节长度即可

是的.怎么才能转变一下呢.我刚开始学C++.还请多指教

#20


怎么省略了ntohl()呢?那是处理整型的字节序的
将网络字节序转换为本机字节序,当不同类型的主机通信时非常必要..

#21


二进制的东西都是一样的
char从到unsinged char其实我所谓转换
C#和C++对接我做过
只要双方数据结构同意
协商好痛心协议就没有问题