基于uCLinux和ARM7的網(wǎng)絡(luò)通信設(shè)計(jì)
*struct sockaddr:用來保存socket信息
struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/
char sa_data[14]; /*14字節(jié)的協(xié)議地址*/};
*struct sockaddr_in;和來進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換
struct sockaddr_in{
short int sin_family; /*地址族*/
unsigned short int sin_port; /*端口號(hào)*/
sruct in_addr sin_addr; /*IP地址*/
unsigned cha sin_zero[8]; /*填充0,以保持與struct sockaddr同樣大小*/};
至此,可經(jīng)編出uCLinux的網(wǎng)絡(luò)通信工程程序。在此給出部分uCLinux下實(shí)現(xiàn)網(wǎng)絡(luò)通信源代碼及其Makefile文件的編寫實(shí)例。
main()函數(shù)中部分代碼如下:
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);/*創(chuàng)建socket*/
bzero(servaddr,sizeof(struct sockaddr_in));
servaddr.sin_family=AF_INET;
servaddr.sin_port=8888;//htons(8888); /*指定通信端口*/將命令行輸入的字符串IP轉(zhuǎn)換為connect函數(shù)可識(shí)別的整數(shù)uiip。本來在Linux上開發(fā)時(shí)可以使用C庫(kù)函數(shù)inet_pton(),但在uCLinux的庫(kù)中不支持該函數(shù),因此只好自己實(shí)現(xiàn)該函數(shù)的功能。
aiptoi()如下所示:
aiptoi(argv[1],uiip);
servaddr.sin_addr.s_addr=uiip; /*指定連接的對(duì)端IP*/
connect(sockfd,(struct sockaddr)servaddr,sizeof(struct sockaddr));
/*連接對(duì)端接收代碼*/
fp=fopen("kongzhi.htm","r"); /*打開控制頁(yè)面*/
while(nsize==1024)
{bzero(szsendbuf,1024); /*每次從文件中讀取巧024個(gè)字節(jié)發(fā)送出去,若讀出少于1024字節(jié)結(jié)束*/
nsize=phead=fread(szsendbuf,1,1024,fp);/*從文件中讀取并填入發(fā)送BUFFER中*/
write(sockfd,head,8);/*發(fā)送協(xié)議頭*/
nsize=write(sockfd,szsendbuf,nsize);/*發(fā)送*/}
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庫(kù),在編寫網(wǎng)絡(luò)程序要切記;②在uCLinux環(huán)境下,處理器(硬件)和內(nèi)核黃素(軟件)均不提供內(nèi)存管理機(jī)制,所以程序的地址空間等同于內(nèi)存的物理地址空間。在程序中可直接對(duì)I/O地址進(jìn)行操作,而不需要申請(qǐng)和釋放I/O空間,但需要用戶自己來檢查所操作的I/O地址的占用情況。
結(jié)語(yǔ)
由于網(wǎng)絡(luò)通信工程廣泛應(yīng)用在嵌入式設(shè)備中,以往的文章只是泛泛地?cái)⑹鼍W(wǎng)絡(luò)通信設(shè)計(jì)的某一個(gè)方面。本文結(jié)合實(shí)際工程項(xiàng)目,從硬件電路的搭建、應(yīng)用軟件的設(shè)計(jì)要點(diǎn)。這對(duì)于在嵌入式設(shè)備中,特別是基于uCLinux的系統(tǒng)中應(yīng)用網(wǎng)絡(luò)通信有重要的參考意義。
參考文獻(xiàn):
[1]. S3C4510B datasheet http://www.dzsc.com/datasheet/S3C4510B_589499.html.
[2]. DM9161 datasheet http://www.dzsc.com/datasheet/DM9161_264516.html.
[3]. RISC datasheet http://www.dzsc.com/datasheet/RISC_1189725.html.
[4]. ARM7TDMI datasheet http://www.dzsc.com/datasheet/ARM7TDMI_139812.html.
[5]. RTL8201 datasheet http://www.dzsc.com/datasheet/RTL8201_586322.html.
[6]. 100M datasheet http://www.dzsc.com/datasheet/100M_2509927.html.
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux相關(guān)文章:linux教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評(píng)論