如何用socket传输unsigned char *的数据

MiddleNightBroken 2012-07-30 03:10:59
int send(SOCKET s,const char *buff,int len,int flags);
int recv(SOCKET s,const char *buff,int len,int flags);
我也不太懂socket,新手一个。
因为要用于工业,我要传输电压的值之类的,请问怎么样可以传送BYTE *的,不要说什么强制转化,会损失数据的。请教了~!~!~!~!
...全文
1378 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
连裆裤 2014-07-23
  • 打赏
  • 举报
回复
学习了 原来是这样啊
zyplayer-doc 2013-09-14
  • 打赏
  • 举报
回复
引用 楼主 sococome 的回复:
int send(SOCKET s,const char *buff,int len,int flags); int recv(SOCKET s,const char *buff,int len,int flags); 我也不太懂socket,新手一个。 因为要用于工业,我要传输电压的值之类的,请问怎么样可以传送BYTE *的,不要说什么强制转化,会损失数据的。请教了~!~!~!~!
妹啊。。。unsigned char型的数据是二进制形式的,而char 则是以 \0 为结束标志,如果强转则会把数据从 \0 那里截断,既然是要send 怎么可以把数据截断?。。。我在读取二进制文件时也遇到这个问题了。。。比如读取一个EXE或者图片文件时。但send函数只能用 const char *型的数据。。。
songjinn 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
另外,对指针强转,是不更改任何内存中的数据的,哪来的什么损失数据之说。
对指针强转,只是为了让编译通过面而已。

比如你要发送一个int数据,则这样强转:int i; send((const char*)&i, ...);
不能是:int i; char c = (char) i; send((const char*) &c, ...);
后者才会损失数据。
[/Quote]
楼上正解!!!!!
youngwolf 2012-07-30
  • 打赏
  • 举报
回复
另外,对指针强转,是不更改任何内存中的数据的,哪来的什么损失数据之说。
对指针强转,只是为了让编译通过面而已。

比如你要发送一个int数据,则这样强转:int i; send((const char*)&i, ...);
不能是:int i; char c = (char) i; send((const char*) &c, ...);
后者才会损失数据。
youngwolf 2012-07-30
  • 打赏
  • 举报
回复
基本上,c/c++里面的所有基本数据类型,都是给编程的人看的,编译成机器语言之后,就没有什么数据类型(可能就只分整型和浮点型了)了,比如:
int a = 1;
char b = 2;

第一句告诉机器,把a代表的内存(长度为size(int)),写入1;
第二句告诉机器,把b代表的内存(长度为size(char)),写入2;

那为什么还要数据类型呢?一是cpu本身支持32位操作;二是我们还有范围的要求(char范围太小了),你完全可以用char[4]来当然一个int,加的时候,你自己去处理进位(只是这样太笨了,cpu已经有的功能,你自己实现了一遍)
youngwolf 2012-07-30
  • 打赏
  • 举报
回复 2
网络编程中,传送的是一片内存里面的数据,这些数据是无类型的(在socket看来),所以linux下,recv接受的参数是const void*,这样省去了开发者强转的步骤。

那windows下为什么要用const char*呢?
我想这是历史遗留问题,不管是windows还是linux,其内部仍然是const char*,不同的是,linux接受const void*参数,在使用的时候,它自己转为const char*而已。为什么呢,因为发送数据的过程中,可能涉及到指针的移动,对一个const void*做移动操作(比如加加)是不允许的(或者说没有这个语义),所以内核在处理缓存的时候,必须的是占8位的某个数据的指针(如果占16位,那就不好处理用户发送单数字节长度的消息了),所以内核完全可以采用const unsigned char*,至于为什么采用了const char*,完全是一个历史遗留。

send函数用了这么多年,按照楼主的意思,只能发送字符串了?你也说了,你是新手,那就要注意你的语气了,不要说什么“不要告诉你怎样怎样的”!

send函数虽然接受一个const char*参数,但它不会把这个参数当成普通意义上的字符串的,普通意义上的字符串,是c语言的约定(以\0为结束符),真正起作用的,是一个指针加一个长度,这样唯一的确定了一片内存。
lqfcu2 2012-07-30
  • 打赏
  • 举报
回复
其实楼主要搞明白,传输的都是字节数据,没什么类型之分的
firendlys 2012-07-30
  • 打赏
  • 举报
回复 3
什么叫"强制转化会损失数据"???在计算机内部,没有类型这个概念,也就不存在是否损失数据这个问题.
所谓的强制转换,其实就是告诉编译器,将这个值按照什么方式进行解释.而这个过程是并不会修改数据的.


对于c/c++来说, char 和 unsigned char 其实就是一样的(都是8bit,1个字节),所以两者在任何地方都可以说是完全等效的.
至于BYTE,其实也就是 unsigned char 而已.

知道了这些,还需要考虑么?

假设你发送的数据是 BYTE* b;
那么发送的时候, send(SOCKET , (const char *)b , int,int);就行了,传输的数据是不会出错的.

至于接收,同样定义一个 BYTE *b ,不过要预先分配好空间, 比如 BYTE*b=new BYTE[100];
然后, recv(SOCKET , (char*)b , int , int ) 就是了.得到的 b 的数据,就是你发送过来的数据了.

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧