首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于uCLinux和ARM7的网络通信设计 02

基于uCLinux和ARM7的网络通信设计 02

参数cliaddr和addrlen用来返回连接对方进程(客户)的协议地址。Addrlen是结果参数,调用前,将由*addrlen所指示的整数值置为由cliaddr所旨的套接口地址结构的长度,返回时,此整数值即为由内核存在此套接口地址结构内的准确字节数。
    3.2 uClinux中网络通信编程的实现
    在uCLinux中进行socket编程,一般按照图书资料所示流程编写网络应用程序。
    除了熟悉前文提出的函数外,还应知道两个重要的数据结构。因为在计算机中,数据存储有两种字节优先顺序:高位字节优先和低位字节优先。在互联网上,数据是以高位字节优先顺序传输的,所以对于在内部以低位字节优先方式存储的数据,需要进行转换才能在互联网上传输。


    *struct sockaddr:用来保存socket信息
    struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/
    char sa_data[14]; /*14字节的协议地址*/};
    *struct sockaddr_in;和来进行数据类型的转换
    struct sockaddr_in{
    short int sin_family; /*地址族*/
    unsigned short int sin_port; /*端口号*/
    sruct in_addr sin_addr; /*IP地址*/
    unsigned cha sin_zero[8]; /*填充0,以保持与struct sockaddr同样大小*/};
    至此,可经编出uCLinux的网络通信工程程序。在此给出部分uCLinux下实现网络通信源代码及其Makefile文件的编写实例。
    main()函数中部分代码如下:
    int sockfd;
    unsigned int uiip;
    char szsendbuf[1024];
    char head[8];
    int*phead=head+4,nsize=1024,allsize=0;
    struct sockaddr_in servaddr;
    sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建socket*/
    bzero(&servaddr,sizeof(struct sockaddr_in));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=8888;//htons(8888); /*指定通信端口*/将命令行输入的字符串IP转换为connect函数可识别的整数uiip。本来在Linux上开发时可以使用C库函数inet_pton(),但在uCLinux的库中不支持该函数,因此只好自己实现该函数的功能。
    aiptoi()如下所示:
    aiptoi(argv[1],&uiip);
    servaddr.sin_addr.s_addr=uiip; /*指定连接的对端IP*/
    connect(sockfd,(struct sockaddr)&servaddr,sizeof(struct sockaddr));
    /*连接对端接收代码*/
    fp=fopen("kongzhi.htm","r"); /*打开控制页面*/
    while(nsize==1024)
    {bzero(szsendbuf,1024); /*每次从文件中读取巧024个字节发送出去,若读出少于1024字节结束*/
    nsize=phead=fread(szsendbuf,1,1024,fp);/*从文件中读取并填入发送BUFFER中*/
    write(sockfd,head,8);/*发送协议头*/
    nsize=write(sockfd,szsendbuf,nsize);/*发送*/}
    fclose(fp);
    uCLinux中的Makefile需做的修改如下:
    CC=gcc
    COFF2FLAT=/uclinux/coff2flt-0.3/coff2flt
    CFLAGS=-I/uclinux/uC-libc-pic/include
    LDFLAGS=/uclinux/uC-libc-pic/libc.a
    ethernet:Ethernet.o
    $(CC)-o $@.coff ethernet.c $(CFLAGS)$(LDFLAGS)
    $(COFF2FLAT)-o Ethernet ethernet.coff
    cp Ethernet /Ethernet
    clean:
    rm -f Ethernet Ethernet.o
    需要注意的是:①uCLinux中不带有pthread库,在编写网络程序要切记;②在uCLinux环境下,处理器(硬件)和内核黄素(软件)均不提供内存管理机制,所以程序的地址空间等同于内存的物理地址空间。在程序中可直接对I/O地址进行操作,而不需要申请和释放I/O空间,但需要用户自己来检查所操作的I/O地址的占用情况。
    结语
    由于网络通信工程广泛应用在嵌入式设备中,以往的文章只是泛泛地叙述网络通信设计的某一个方面。本文结合实际工程项目,从硬件电路的搭建、应用软件的设计要点。这对于在嵌入式设备中,特别是基于uCLinux的系统中应用网络通信有重要的参考意义。
返回列表