当前位置:  技术问答>linux和unix

嵌入式linux网络编程的问题

    来源: 互联网  发布时间:2016-05-11

    本文导语:  我在进行嵌入式linux的socket编程时出现了这样的一个问题 开始的时候service和client都在电脑上运行的时候测试没任何问题,可是把client下载到电路板上和电脑进行通信的时候就出问题了。 传输的包中的short型数据都出...

我在进行嵌入式linux的socket编程时出现了这样的一个问题
开始的时候service和client都在电脑上运行的时候测试没任何问题,可是把client下载到电路板上和电脑进行通信的时候就出问题了。
传输的包中的short型数据都出问题了,高8位和低8位都交换了。电脑上的1传输到板子上后都成了256.
我觉得这和数据存储的优先顺序有关系。
service()
{......
/*set sockaddr_in founctions*/
saddr.sin_family=AF_INET;
saddr.sin_port=htons(SERVPORT);                           //用的是htons
saddr.sin_addr.s_addr=INADDR_ANY;
bzero(&(saddr.sin_zero),8);
......
}

client()
{......
saddr.sin_family=AF_INET;
        saddr.sin_port=htons(SERVPORT);                           //用的是htons
         saddr.sin_addr = *((struct in_addr *)host->h_addr);
        bzero(&(saddr.sin_zero),8);
.......
}

我把两边的htons改成ntohs也没用。
请问是什么问题?

|
看起来是little endian和big endian的问题。
但未必是,我对网络编程不熟悉,但我想网络编程时的API应该可以屏蔽底层的
endian问题。

这里是简单的检测 little和big endian的程序(摘自 APUE2 Unix环境高级编程第二版)

Figure C.20. Determine byte order on system
#include 
#include 
#include 

int
main(void)
{
    uint32_t i;
    unsigned char *cp;

    i = 0x04030201;
    cp = (unsigned char *)&i;
    if (*cp == 1)
        printf("little-endiann");
    else if (*cp == 4)
        printf("big-endiann");
    else
        printf("who knows?n");
    exit(0);
}


|
楼上说的有道理,即使是大小端系统交互
网络编程中都可以屏蔽这些差异,因为经过了网络字节序和本地字节序的转换

你传输的是short数据?
为什么要按照8位来访问呢?
short的两个8位在大小端系统上存储的位置正好反了
如果你以八位来读,其就反了
相当于你按照位域的形式来访问short了,此时大小端系统间就是不可以移植的
这是嵌入式程序和PC程序的差异

但若你以short来读,合成后两端的值就是匹配的了

|
“传输的包中的short型数据都出问题了,高8位和低8位都交换了。电脑上的1传输到板子上后都成了256.”
什么意思?

把你怎么定义数据怎么取数据的过程说明白!!!!
你定义一个short数据,不管其在大端还是小断系统上,
尽管存储格式可能不一样,但只要是short读取,肯定不会变的

///////////
两个办法: 
1,做个结构的转化函数;发送之前,接受之后对结构进行转换。 
2,结构中不要定义大于1个字节的项。
///////////
要是你这样,大小端系统如果要交互的话还不累死了??如果结构体只能定义char还有意义么?

假设大端系统ARM传递short a=0x1234到小端系统PC
ARM中,&a=0x100,大端系统,高字节放在低地址
则*0x100 = 0x12,*0x101 = 0x34

网络上传递字节流,从低地址开始传递,且为大端模式
ARM到网络,同为大端,无需转换,因此网络上的字节流为0x12,0x34


存放放到PC上时,网络字节序转换后,字节流为0x34,0x12,设b保存a
&b = 0x100000
则*0x100000 = 0x34,*0x100001 = 0x12
高低字节颠倒了,若你以8位访问,则会发现同样是低字节
*0x100 = 0x12 != *0x100000 = 0x34

可是short访问时
*(short *)0x100 = *(short *)0x100000  = 0x1234


|



如果是串口或者其他途径,那么是需要手动转换
但lz现在就是网络编程,系统已经自动转换了


为什么要进行字节序的转换?
就是为了防止单纯的将字节流按照地址存放

如大端系统short 0x1234,从低地址到高地址的字节流为0x12,0x34
若不进行字节序的转换,则保存到小端系统上
低地址为0x12,高地址为0x34

因为是小端系统,short访问时,认为低地址是低字节,高地址是高字节
则short数据为0x3412
和大端系统上的short不一样

因此字节序的转换就是为了解决这种问题,
这就保证了大端的short 0x1234放在小端上仍然为short 0x1234

    
 
 

您可能感兴趣的文章:

  • 嵌入式网络编程与非嵌入式网络编程有什么不同
  • 嵌入式linux网络编程的问题,大虾来接分
  • 嵌入式uclinux中网络编程的问题
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!
  • 有谁做过嵌入式 Linux开发?是否有嵌入式Linux的JVM?
  • 问一个弱弱的问题:做嵌入式开发,宿主机的Linux版本一定要跟目标机上的嵌入式Linux版本一致么?
  • 我怎么糊涂了:想开发嵌入式系统(目标机采用UCLINUX嵌入式操作系统),在RED HAT LINUX下开发,选用什么工具呢?QT还是qt embedded?
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 请问什么是嵌入式数据库?(空)
  • 关于“嵌入式Linux”
  • 嵌入式系统的学习
  • 嵌入式学习方法
  • 请问:构建一个嵌入式开发环境时的疑问?
  • linux 嵌入式开发用买开发板吗?
  • 求嵌入式Linux的入门书籍!
  • 嵌入式应用开发协作系统 Yocto
  • 嵌入式系统的C运行库 Newlib
  • 嵌入式GLIBC EGLIBC
  • 驱动程序开发和嵌入式开发有什么联系吗?
  • 嵌入式 syslog
  • vc++与Linux嵌入式
  • 计算机专业学习 嵌入式可以么 ??
  • 嵌入式软件下面有哪些具体的研究方向?细分一下 求指点!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 现在LINUX主要用在哪些嵌入式设备上?
  • 嵌入式系统 Prex
  • web开发和嵌入式开发哪个更有挑战
  • 嵌入式linux 组播接收问题
  • 国内有哪些好的嵌入式公司???
  • 开源嵌入式操作系统 Contiki
  • 嵌入式Web服务器 Appweb
  • 实时嵌入式操作系统 NuttX
  • 嵌入式系统虾米意思呀?
  • Linux 用什么工具进行嵌入式开发。
  • 我想学习Linux 嵌入式开发,请大家指教
  • java 还是LINUX嵌入式???
  • 了解嵌入式开发的朋友请进!
  • 是考验还是嵌入式??
  • linux运维转linux嵌入式
  • 嵌入式GUI库 eSWT
  • 嵌入式系统考研请教?
  • ARM 嵌入式系统的仿真器 Softgun
  • 如何开发嵌入式Linux操作系统?
  • 关于初学嵌入式的一些问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3