欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      浙工大 嵌入式實驗報告

      時間:2019-05-14 04:41:52下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《浙工大 嵌入式實驗報告》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《浙工大 嵌入式實驗報告》。

      第一篇:浙工大 嵌入式實驗報告

      金艷霞

      通信2班

      201203110210

      實驗五 Linux交叉編譯平臺

      一、實驗?zāi)康?/p>

      1.掌握一些基本的linux讀寫操作 2.利用vcc編譯c程序

      3.通過nfs掛載到實驗箱中,利用交叉編譯執(zhí)行文件

      二.實驗設(shè)備

      1.Arm9試驗箱 2.Pc機

      3.Linux系統(tǒng)服務(wù)器

      三.實驗過程及實驗結(jié)果 1.連接電腦箱

      2.設(shè)置交叉編譯環(huán)境 啟動putty.exe 登陸192.168.1.116

      3.添加軟件包至實驗?zāi)夸洠?① [shiyan@localhost ~]$ cd /home/shiyan ② [shiyan@localhost ~]$ tar –zxvf arm-linux-gcc-3.4.4-glib-2.3.5-static.tar.gz tar-zxvf arm-linux-gcc-3.4.4-glib-2.3.5-static.tar.gz ③ [shiyan@localhost201203110210] $export PATH=$PATH:/home/shiyan/201203110210/opt/crosstool/arm-linux/gcc-3.4.4-glib-2.3.5/arm-linux/bin ④ [shiyan@localhost 201203110210]$ set OSTYPE=linux-gnu PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/shiyan/bin:/home/shiyan/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/bin:/home/shiyan/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/bin:/home/shiyan/opt/crosstool/arm-linux/gcc-3.4.4-glibc-2.3.5/arm-linux/bin 可以看出路徑已添加 ⑤ [shiyan@localhost 201203110210]$ arm-linux-g再按tab arm-linux-g++

      arm-linux-gcc

      arm-linux-gcc-3.4.4 arm-linux-gccbug

      arm-linux-gcov ⑥ [shiyan@localhost 201203110210]$ arm-linux-gcc arm-linux-gcc: no input files 此時出錯,無此文件 3.測試程序 ① 創(chuàng)建hello.c [shiyan@localhost ~]$ vi hello.c #include int main(){ printf(“jin123”);return 0;}

      :wq ② 查看是否生成文件

      [shiyan@matrix 201203110210]$ ls arm-linux-gcc-3.4.4-glib-2.3.5-static.tar.gz hello.c 已經(jīng)生成 ③ 打開hello.c [shiyan@localhost ~]$./hello.c-bash:/hello cannot execute binary file 表示無法在服務(wù)器上執(zhí)行 ④ 交叉編譯hello.c [shiyan@localhost ~]$ arm-linux-gcc-o hello hello.c ⑤ 將文件拷貝到nfs下

      [shiyan@localhost ~]$ cp hello /home/shiyan/nfs ⑥ 掛載服務(wù)器到板子上

      / $ mount –tnfs-o nolock 192.168.1.116:/home/shiyan/nfs/mnt/nfs / $cdmnt/nfs ⑦ 打開hello文件 / $./hello

      結(jié)果輸出: Jin 123

      四.實驗總結(jié)

      上述實驗可以得出,交叉編譯的二進制可以在板子上運行,卻不能在服務(wù)器上運行,很好的認清了交叉編譯的意義和功能。

      實驗六Armboot下載運行及tcp實驗

      一.實驗?zāi)康?/p>

      1.掌握armboot的編譯 2.掌握tftp工具的使用 3.掌握armboot下載運行

      4.掌握windows的 tcp客戶端的建立及通信過程 5.掌握tcp的基本原理

      二.實驗設(shè)備

      1.Arm9試驗箱 2.Pc機

      3.Linux系統(tǒng)服務(wù)器

      三.實驗過程及實驗結(jié)果 1)Armboot

      ① 編譯armboot-1.1.0 cd /home/shiyan/arm-linux-2.6/armboot-1.1.0 [shiyan@matrix armboot-1.1.0]$ make

      ② 產(chǎn)生的armboot.bin拷貝到tftp的目錄服務(wù)下

      [shiyan@matrixarmboot-1.1.0]$ cparmboot.bin /home/shiyan/arm-linux-2.6/armboot-1.1.0/tftpboot/armboot ③ 打開arm9開發(fā)板,在五秒內(nèi)按ESC,檢查網(wǎng)絡(luò)環(huán)境

      CPE>printenv bootdelay=3 baudrate=38400 ethaddr=00:40:25:00:00:01 netmask=255.255.255.0 sererip=192.168.1.65 ipaddr=192.168.1.111 serverip=192.168.1.30

      Environment size: 139/131068 bytes ④ 將armboot的網(wǎng)絡(luò)環(huán)境改為tftp服務(wù)的網(wǎng)絡(luò)地址

      setenv serverip 192.168.1.220 CPE>saveenv Un-Protected 1 sectors Erasing sector 6...ok.0x800e0000

      o Flash...done.Protected 1 sectors

      ⑤ 將armboot.bin文件通過tftp傳輸?shù)絻?nèi)存0x2000000H中

      CPE>tftp 0x2000000 armboot.bin ARP broadcast 1 ARP broadcast 2

      ⑥ 運行

      go 0x2000000

      ⑦ 檢查網(wǎng)絡(luò)環(huán)境

      CPE> printenv bootdelay=3 baudrate=38400 ethaddr=00:40:25:00:00:01 netmask=255.255.255.0 sererip=192.168.1.65 ipaddr=192.168.1.111 serverip=192.168.1.220

      通過serverip的改變可看出armboot下載的正確性。

      實驗七 Mount掛載實驗

      一.實驗?zāi)康?1.掌握一些基本的linux讀寫操作(touch指令)2.掌握Usb掛載方法 3.掌握配置nfs的方法

      二.實驗設(shè)備

      1.2.3.4.Arm9試驗箱 Pc機

      Linux系統(tǒng)服務(wù)器 U盤

      三.實驗過程及實驗結(jié)果 A.文件夾掛載 1.服務(wù)器

      [shiyan@matrix ~]$/etc/rc.d/init.d/nfs start 2.板子掛載

      / $ ifconfig eth0 192.168.1.98 / $ mount-t nfs-o nolock 192.168.1.220:/home/shiyan/nfs/mnt/nfs /$ df Filesystem

      1k-blocks

      Used Available Use% Mounted on /dev/mtdblock1

      1024

      544

      480 53% /mnt/mtd 192.168.1.220:/home/shiyan/nfs 515455456 59590720 429681056 12% /mnt/nfs B.Usb 掛載

      ① 將u盤插入arm9開發(fā)板,并啟動 ② 查看盤符信息

      / $ fdisk-l

      ③ 創(chuàng)建一個/mnt/usb文件夾

      / $ mkdir /mnt/usb ④ 把sda1盤符mount到/mnt/usb文件上

      / $ mount /dev/sda1 /mnt/usb/ / $ cd /mnt/usb /mnt/usb $ ls

      ⑤ 創(chuàng)建文件,并輸入字符串

      /mnt/usb $ vi jin.txt

      hello!

      ⑥ 解掛載

      /mnt/usb $ unmount /mnt/usb/ /bin/sh: unmount: not found ⑦ 將u盤拔出,插入電腦,觀察該文件

      結(jié)果正確

      實驗八RTC時鐘驅(qū)動實驗

      一.實驗?zāi)康?/p>

      1.了解RTC工作原理 2.掌握RTC時鐘驅(qū)動編程

      二.實驗內(nèi)容

      1.編寫RTC驅(qū)動程序

      2.通過insmod加載驅(qū)動程序 3.編寫代碼修改RTC內(nèi)部時間

      三.實驗設(shè)備

      1.PC機

      2.Arm9實驗箱客戶端 3.Linux操作系統(tǒng)服務(wù)端

      四.實驗過程及結(jié)果

      1.實驗代碼

      #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DRIVER_VERSION

      “0.01” /* Register map */ /* rtc section */ // control and status registers #define REG_CS1 0x00

      #define TEST1

      (1<<7)

      // 0-normal mode, must be set to logic 0 during normal operations;1-EXT_CLK test mode #define STOP

      (1<<5)

      // 0-RTC source clock runs;1-the RTC clock is stopped(CLKOUT at 32.768KHz is still available)#define TESTC

      (1<<3)

      // 0-power-on reset(POR)override facility is disable;set to logic 0 for normal operation;1-POR override may be enable #define REG_CS2 0x01 #define TI_TP

      (1<<4)

      // 0-int is active when TF is active(subject to the status of TIE)#define AF

      (1<<3)#define TF

      (1<<2)#define AIE

      (1<<1)#define TIE

      (1<<0)

      // Time and date registers #define REG_SC 0x02

      // vl_seconds(0-59)#define REG_MN 0x03

      // minutes(0-59)#define REG_HR 0x04

      // hours(0-23)#define REG_DT 0x05

      // days(1-31)#define REG_DW 0x06

      // weekdays(0-6)#define REG_MO 0x07

      // century_months(1-12)#define REG_YR 0x08

      // years(0-99)

      // Alarm registers #define REG_MA 0x09

      // minute_alarm #define AE_M

      (1<<7)#define REG_HA 0x0a

      // hour_alarm #define AE_H

      (1<<7)#define REG_DA 0x0b

      // day_alarm #define AE_D

      (1<<7)#define REG_WA 0x0c

      // weekday_alarm #define AE_W

      (1<<7)// CLKOUT control register #define REG_CC 0x0d #define FE

      (1<<7)// Timer registers #define REG_TC 0x0e

      // timer_control #define TE

      (1<<7)#define REG_TMR 0x0f

      // timer #define RTC_SECTION_LEN

      /* i2c configuration */ #define I2C_ADDR

      0xa2 ///////////////////////////////////////////////////////////// #define DEFAULT_I2C_CLOCKDIV

      180//for APB 108MHz staticunsignedlong rtc_status;staticvolatileunsignedlong rtc_irq_data;staticunsignedlong rtc_freq = 1;/*FTRTC010 supports only 1Hz clock*/ staticstruct fasync_struct *rtc_async_queue;static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);extern spinlock_t rtc_lock;MODULE_AUTHOR(“GM Corp.”);MODULE_LICENSE(“GM License”);externint GM_i2c_xfer(struct i2c_msg *msgs, int num, int clockdiv);/* block read */ staticint i2c_read_regs(u8 reg, u8 buf[], unsigned len){ struct i2c_msg msgs[1];//////////////

      buf[0] = reg;

      msgs[0].addr = I2C_ADDR>>1;

      msgs[0].flags = 0;

      msgs[0].len = 1;

      msgs[0].buf = buf;

      if(GM_i2c_xfer(msgs, 1, DEFAULT_I2C_CLOCKDIV)!= 1)return-1;//////////////

      msgs[0].addr = I2C_ADDR>>1;

      msgs[0].flags = 1;

      msgs[0].len = len+1;

      msgs[0].buf = buf;

      if(GM_i2c_xfer(msgs, 1, DEFAULT_I2C_CLOCKDIV)!= 1)return-1;return 0;} /* block write */ staticint i2c_set_regs(u8 reg, u8 const buf[], unsigned len){

      u8 i2c_buf[10];struct i2c_msg msgs[1];

      i2c_buf[0] = reg;

      memcpy(&i2c_buf[1], &buf[0], len);

      msgs[0].addr = I2C_ADDR>>1;

      msgs[0].flags = 0;

      msgs[0].len = len+1;

      msgs[0].buf = i2c_buf;

      if(GM_i2c_xfer(msgs, 1, DEFAULT_I2C_CLOCKDIV)!= 1)return-1;return 0;} staticint set_time(struct rtc_time const *tm){ int sr;

      u8 regs[RTC_SECTION_LEN] = { 0, };

      printk(“stop RTCn”);

      regs[0] = STOP;

      regs[1] = 0x00;

      // disable interrupt and clear all flags

      sr = i2c_set_regs(REG_CS1, regs, 2);if(sr < 0){

      // write control and status registers

      printk(“%s: stop RTC failedn”, __func__);return sr;

      }

      printk(“set_time Date(y/m/d):%d/%d/%d Time(h/m/s):%d/%d/%dn”,tm->tm_year,tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);

      regs[REG_SC-REG_SC] = BIN2BCD(tm->tm_sec);

      regs[REG_MN-REG_SC] = BIN2BCD(tm->tm_min);

      regs[REG_HR-REG_SC] = BIN2BCD(tm->tm_hour);

      regs[REG_DT-REG_SC] = BIN2BCD(tm->tm_mday);

      regs[REG_MO-REG_SC] = BIN2BCD(tm->tm_mon);

      regs[REG_YR-REG_SC] = BIN2BCD(tm->tm_year-100);

      regs[REG_DW-REG_SC] = BIN2BCD(tm->tm_wday & 7);/* write RTC registers */

      sr = i2c_set_regs(REG_SC, regs, RTC_SECTION_LEN);if(sr < 0){

      printk(“%s: writing RTC section failedn”, __func__);return sr;

      }

      printk(“start RTCn”);

      regs[0] = 0x00;

      sr = i2c_set_regs(REG_CS1, regs, 1);if(sr < 0){

      // write control and status registers

      printk(“%s: start RTC failedn”, __func__);return sr;

      }

      return 0;

      } staticvoid read_time(struct rtc_time *tm){ int sr;

      u8 regs[RTC_SECTION_LEN] = { 0, };

      sr = i2c_read_regs(REG_SC, regs, RTC_SECTION_LEN);if(sr < 0){

      printk(“%s: reading RTC section failedn”, __func__);return;

      }

      tm->tm_sec = BCD2BIN(regs[REG_SC-REG_SC]&0x7f);

      tm->tm_min = BCD2BIN(regs[REG_MN-REG_SC]&0x7f);

      tm->tm_hour = BCD2BIN(regs[REG_HR-REG_SC]&0x3f);

      tm->tm_mday = BCD2BIN(regs[REG_DT-REG_SC]&0x3f);

      tm->tm_wday = BCD2BIN(regs[REG_DW-REG_SC]&0x07);

      tm->tm_mon = BCD2BIN(regs[REG_MO-REG_SC]&0x1f);/* rtc starts at 1 */

      tm->tm_year = BCD2BIN(regs[REG_YR-REG_SC])+100;

      printk(“read_time Date(YY/MM/DD):%d/%d/%d Time(hh/mm/ss):%d/%d/%dn”,tm->tm_year,tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);} staticunsigned AIE_stat=0;/*ijsung: arch-indep function*/ staticint rtc_open(struct inode *inode, struct file *file){ if(test_and_set_bit(1, &rtc_status))return-EBUSY;

      rtc_irq_data = 0;return 0;} staticint rtc_release(struct inode *inode, struct file *file){ unsignedchar buf[7];

      rtc_status = 0;return 0;} staticint rtc_fasync(int fd, struct file *filp, int on){ return fasync_helper(fd, filp, on, &rtc_async_queue);} staticunsignedint rtc_poll(struct file *file, poll_table *wait){

      poll_wait(file, &rtc_wait, wait);return(rtc_irq_data)? 0 : POLLIN | POLLRDNORM;} static loff_t rtc_llseek(struct file *file, loff_t offset, int origin){ return-ESPIPE;} ssize_t rtc_read(struct file *file, char *buf, size_t count, loff_t *ppos){

      DECLARE_WAITQUEUE(wait, current);unsignedlong data;

      ssize_t retval;if(count

      add_wait_queue(&rtc_wait, &wait);

      set_current_state(TASK_INTERRUPTIBLE);for(;;){

      spin_lock_irq(&rtc_lock);

      data = rtc_irq_data;if(data!= 0){

      rtc_irq_data = 0;break;

      }

      spin_unlock_irq(&rtc_lock);if(file->f_flags & O_NONBLOCK){

      retval =-EAGAIN;goto out;

      } if(signal_pending(current)){

      retval =-ERESTARTSYS;goto out;

      }

      schedule();

      }

      spin_unlock_irq(&rtc_lock);

      data-= 0x100;/* the first IRQ wasn't actually missed */

      retval = put_user(data,(unsignedlong *)buf);if(!retval)

      retval = sizeof(unsignedlong);out:

      set_current_state(TASK_RUNNING);

      remove_wait_queue(&rtc_wait, &wait);return retval;} staticint rtc_ioctl(struct inode *inode, struct file *file, unsignedint cmd, unsignedlong arg){ struct rtc_time tm, tm2;unsignedchar buf[7];switch(cmd){ case RTC_AIE_OFF:

      printk(“Not Supportn”);return 0;case RTC_AIE_ON:

      printk(“Not Supportn”);return 0;case RTC_ALM_READ:

      printk(“Not Supportn”);return 0;case RTC_ALM_SET:

      printk(“Not Supportn”);return 0;case RTC_RD_TIME:

      read_time(&tm);break;

      case RTC_SET_TIME:

      { unsigned usertime;unsignedchar buf[7];if(!capable(CAP_SYS_TIME))return-EACCES;if(copy_from_user(&tm,(struct rtc_time*)arg, sizeof(tm)))return-EFAULT;

      set_time(&tm);

      } return 0;case RTC_IRQP_READ: return put_user(rtc_freq,(unsignedlong *)arg);case RTC_IRQP_SET: if(arg!= 1)return-EINVAL;return 0;case RTC_EPOCH_READ: return put_user(1970,(unsignedlong *)arg);default: return-EINVAL;

      } return copy_to_user((void *)arg, &tm, sizeof(tm))?-EFAULT : 0;} staticstruct file_operations rtc_fops = {

      owner:

      THIS_MODULE,llseek:

      rtc_llseek,read:

      rtc_read,poll:

      rtc_poll,ioctl:

      rtc_ioctl,open:

      rtc_open,release: rtc_release,fasync:

      rtc_fasync, };staticstruct miscdevice ftrtc010rtc_miscdev = {

      RTC_MINOR,“rtc”, &rtc_fops };staticint rtc_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data){ // unsigned alarm_time;unsignedchar buf[7];

      char *p = page;int len;struct rtc_time tm;

      read_time(&tm);//printk(“RTC...%dn”,xtime.tv_sec);

      p += sprintf(p, “rtc_timet: %02d:%02d:%02dn”

      “rtc_datet: %04d-%02d-%02dn”

      “rtc_epocht: %04dn”,tm.tm_hour + 1, tm.tm_min, tm.tm_sec,tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, 2000);// read_alarm(&tm);// p += sprintf(p, “alrm_timet: %2dth day of week dayn” //

      “alrm_datet: N/A for Platformn”, //

      tm.tm_wday);

      p += sprintf(p, “alrm_timet: Not Supportn”

      “alrm_datet: Not Supportn”);

      p += sprintf(p, “alarm_IRQt: %sn”, AIE_stat ? “yes” : “no”);

      len =(poff;if(len < 0)

      len = 0;

      *eof =(len <= count)? 1 : 0;

      *start = page + off;return len;} staticint __init rtc_init(void){

      misc_register(&ftrtc010rtc_miscdev);

      create_proc_read_entry(“driver/rtc”, 0, 0, rtc_read_proc, NULL);

      printk(“PCF8563 Real Time Clock drivern”);return 0;} staticvoid __exit rtc_exit(void){

      remove_proc_entry(“driver/rtc”, NULL);

      misc_deregister(&ftrtc010rtc_miscdev);} module_init(rtc_init);module_exit(rtc_exit);

      2.掛載usb / $ ifconfig eth0 192.168.1.99 / $ mount-t nfs-o nolock 192.168.1.220:/home/shiyan/nfs /mnt/nfs / $ fdisk –l / $ mkdir /mnt/usb / $ mount /dev/sda1 /mnt/usb/ / $ cd /mnt/usb

      3.找到u盤中的pcf8563.ko /mnt/usb $ ls

      4.加載pcf8563.ko /mnt/usb $ insmod pcf8563.ko

      5.更改日期并寫入

      6.重啟檢驗日期

      與當前時間相符

      實驗九視頻采集RTP發(fā)送及遠程視頻監(jiān)控實驗

      一.實驗?zāi)康?1.理解視頻傳輸原理

      2.掌握在IP網(wǎng)絡(luò)中實現(xiàn)視頻傳輸?shù)姆椒?3.理解遠程控制原理

      4.掌握在windows下TCP客戶端建立及通信過程

      二.實驗內(nèi)容

      1.搭建點對點視頻傳輸模式 2.開啟視頻采集

      3.開啟Windows下tcp客戶端,完成控制命令

      三.實驗設(shè)備

      1.硬件:基于雙核處理器架構(gòu)的網(wǎng)絡(luò)音視頻傳輸教學實驗系統(tǒng);

      對接線; 串口連接線; 網(wǎng)線;

      集線器(HUB),PC機;

      2.軟件:H.264流媒體軟件

      設(shè)備端視頻采集程序 設(shè)備端視頻傳輸程序 串口操作軟件

      四.實驗步驟及結(jié)果 A.視頻采集

      1.連接好實驗箱,打開串口通信端,遠程mount到home/nfs文件夾 / $ mount-t nfs-o nolock 192.168.1.116:/home/shiyan/nfs /mnt/nfs 2.掛載服務(wù)器下nfs與板子的/mnt/nfs,進入/mnt/nfs文件夾 / $ cd /mnt/nfs 3.輸入ls命令,目錄下文件 /mnt/nfs $ ls 123321

      clientxxww

      readme

      tcpserver StartLog0

      ffgpio.ko

      server

      tcpserver19 a

      gpio_test

      serverfxf

      tcpserver_arm_11 bo

      hello

      serverxw

      tcpserver_hdt client

      nfs1

      tcpclient

      tcpserver_zn client_arm

      ok

      tcpclient19

      tcpsever client_arm_17

      program_20_1.c

      tcpclient_29

      tw2835_menu client_arm_st20

      program_20_2.c

      tcpclient_arm_11 xianshi client_dalan

      programyk

      tcpclient_hdt

      yk clientxw

      programyq

      tcpclient_zn

      yq 4.運行tw2835_menu進行視頻采集 /mnt/nfs $./tw2835_menu&

      5.進入掛載目錄并查看文件 /mnt/nfs $ cd nfs1 /mnt/nfs/nfs1 $ ls dev_app.app

      hello

      vedio.confTCPS1

      dev_app3

      ffgpio.ko

      tw2835_menu dev_app

      gpio_test

      tw2835_pic 6.運行dev_app到板子IP192.168.1.9 /mnt/nfs/nfs1 $./dev_app 192.168.1.9 7.開啟H.264流媒體播放器進行視頻接受 a)用解碼器解碼,并允許注冊.bat

      b)打開H.264流媒體播放器,點擊開啟視頻接收

      B.遠程視頻監(jiān)控

      1.重復(fù)以上實驗1~4步

      2.進入已掛載目錄/mnt/nfs/nfs1,看到多個程序 /mnt/nfs $ cd nfs1 /mnt/nfs/nfs1 $ ls StartLog0

      dev_app.app

      hello

      vedio.conf TCPS1

      dev_app3

      image.info

      www boot.sh

      ffgpio.ko

      tw2835_menu 3.運行TCPS1 /mnt/nfs/nfs1 $./ TCPS1 4.程序進入等待狀態(tài),等待TCP連接到來

      5.開啟H.264流媒體播放器,點擊“開始視頻接收”,屏幕變黑

      6.點擊“控制功能”,輸入設(shè)備端ip地址192.168.1.68,點擊連接

      7.設(shè)備端出現(xiàn)下列字樣,表示連接成功

      Servergetconnectionfrom192.168.1.68 8.點擊“開啟視頻監(jiān)控”,獲得視頻數(shù)據(jù)

      實驗十一Tcp網(wǎng)絡(luò)編程

      一、實驗?zāi)康?/p>

      1.了解網(wǎng)絡(luò)編程原理 2.了解套接字的使用

      二、實驗原理

      嵌入式Linux的網(wǎng)絡(luò)通信程序是基于套接字模式的。Socket實際是網(wǎng)絡(luò)傳輸層供給應(yīng)用層的接口。常見的Socket有三種類型。1.流式Sockct 流式套接字提供可靠的,面向連接的通信流,它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序性。Socket編程采用客戶/服務(wù)器模式。因此編程分為服務(wù)器端和客戶端。服務(wù)器端:首先建立Socket,返回該Socket的描述符;配置Socket的端口和IP地址;建立監(jiān)聽函數(shù),檢測是否有客戶端向服務(wù)器端發(fā)送請求,若有則接收該請求,將其放到接收隊列中;從接收隊列中接收一個請求;并向客戶端發(fā)送確認連接信息。客戶端:建立一個Socket,返回該Socket的描述符,配置Socket端口和IP地址;向服務(wù)器發(fā)送連接請求,并接收服務(wù)器發(fā)回的確認連接信息。雙方通信結(jié)束后,關(guān)閉其Socket。2.數(shù)據(jù)報Socket,數(shù)據(jù)通過相互獨立的報文進行傳輸,數(shù)據(jù)報套接字定義了一種無連接的服務(wù),是無序的,并且不保證是可靠的,無差錯的。它使用數(shù)據(jù)報協(xié)議UDP。3.原始Socket 使用Socket編程時可以開發(fā)客戶機和服務(wù)器端應(yīng)用程序,它們可以在本地網(wǎng)絡(luò)上進行通信,也可以通過Internet在全球范圍內(nèi)進行通信。編寫并運行Socket的客戶端和服務(wù)器端程序,雙方通過套接字建立了服務(wù)連接請求,并且通過一些方法提高Socket的性能。

      三、實驗步驟

      編寫服務(wù)器端源程序和客戶端源程序

      1.代碼:

      program_20_1.c #include #include #include #include #include #include #include #include #include #include #include #include

      int main(int argc, char *argv[]){

      int sockfd,new_fd;

      struct sockaddr_in server_addr;

      struct sockaddr_in client_addr;

      int portnumber;

      const char hello[]=“Hello and Byen”;// for setsockopt()SO_REUSEADDR, below

      int yes = 1;int addrlen;

      if(argc!=2)

      {

      fprintf(stderr,“Usage:%s portnumberan”,argv[0]);

      exit(1);

      }

      if((portnumber=atoi(argv[1]))<0)

      {

      fprintf(stderr,“Usage:%s portnumberan”,argv[0]);

      exit(1);

      }

      /* 服務(wù)器端開始建立socket描述符 */

      if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

      {

      fprintf(stderr,“Socket error:%sna”,strerror(errno));

      exit(1);

      }

      printf(“Server-socket()is OK...n”);

      // “address already in use” error message

      if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int))==-1)

      {

      perror(“Server-setsockopt()error lol!”);

      exit(1);

      }

      printf(“Server-setsockopt()is OK...n”);

      /* 服務(wù)器端填充 sockaddr結(jié)構(gòu) */

      bzero(&server_addr,sizeof(struct sockaddr_in));

      server_addr.sin_family=AF_INET;

      server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

      server_addr.sin_port=htons(portnumber);

      memset(&(server_addr.sin_zero), '