嵌入式課程設(shè)計(jì)報(bào)告畢業(yè)論文_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  通信與信息工程學(xué)院</b></p><p><b>  嵌入式開發(fā)技術(shù)</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p><b>  通信與信息工程學(xué)院</b></p><p><b>  二

2、〇一六年</b></p><p><b>  目 錄</b></p><p><b>  嵌入式課程設(shè)計(jì)1</b></p><p><b>  1 設(shè)計(jì)要求1</b></p><p>  1.1 基本題型1</p><p>  1.2

3、 綜合題型2</p><p>  2 開發(fā)環(huán)境、開發(fā)工具2</p><p>  3設(shè)計(jì)過程及結(jié)果5</p><p>  3.1 實(shí)現(xiàn)交叉編譯環(huán)境5</p><p>  3.2第幾小組成員步驟5</p><p>  3.3實(shí)現(xiàn)Linux系統(tǒng)下的簡易聊天室7</p><p><b&

4、gt;  4 設(shè)計(jì)總結(jié)20</b></p><p><b>  參考文獻(xiàn)22</b></p><p><b>  嵌入式課程設(shè)計(jì)</b></p><p><b>  1 設(shè)計(jì)要求</b></p><p><b>  1.1 基本題型</b>

5、</p><p> ?。?)嵌入式開發(fā)環(huán)境配置</p><p>  ①采用vmware+linux配置開發(fā)主機(jī)系統(tǒng),要求構(gòu)建linux系統(tǒng),配置nfs,samba;</p><p> ?、谡莆誱inicom、samba及NFS使用,能利用其實(shí)現(xiàn)windows、linux開發(fā)主機(jī)與嵌入式實(shí)驗(yàn)系統(tǒng)間的通信;</p><p> ?、劾肗FS服務(wù)實(shí)

6、現(xiàn)主機(jī)與實(shí)驗(yàn)系統(tǒng)間文件共享;</p><p> ?、芾锰峁┑墓ぞ邩?gòu)建交叉編譯環(huán)境;</p><p>  要求:在下圖時(shí)間上面一行顯示小組成員姓名</p><p>  Armv4l-unknown-linux-gcc 是 否 在/opt/host/armv4l/bin/,如果不是這個(gè)路徑,請(qǐng)使用 vi 修改/root/.bash_profile 文件中 。ATH變

7、量 為 PATH=$PATH:$HOME/bin:/opt/host/armv4l/bin/ , 存 盤 后 執(zhí) 行 : source /root/.bash_profile</p><p> ?。?)熟悉VI、GCC、GDB及MAKE文件使用;</p><p> ?。?)在開發(fā)系統(tǒng)中編寫一個(gè)程序,實(shí)現(xiàn)打印“通信工程13級(jí)第3小組嵌入式開發(fā)技術(shù)課程設(shè)計(jì)基礎(chǔ)內(nèi)容”功能,編寫makefile

8、文件,并通過NFS下載到實(shí)驗(yàn)箱中,驗(yàn)證交叉編譯環(huán)境配置。</p><p><b>  1.2 綜合題型</b></p><p>  基于socket編程的簡單聊天室程序設(shè)計(jì):</p><p> ?。?)掌握linux下socket編程方法;</p><p> ?。?)基于C語言設(shè)計(jì)一個(gè)簡單的聊天室程序,PC運(yùn)行客戶端程序

9、,嵌入式系統(tǒng)運(yùn)行服務(wù)器端程序,服務(wù)器隨時(shí)偵聽客戶端請(qǐng)求并將其接入,要求至少實(shí)現(xiàn)2個(gè)客戶端接入服務(wù)器并進(jìn)行通信的功能;</p><p>  (3)編寫Makefile文件;</p><p>  (4)利用NFS將程序下載到實(shí)驗(yàn)箱中,編譯執(zhí)行。</p><p> ?。?)課程設(shè)計(jì)報(bào)告中應(yīng)包含服務(wù)器端socket創(chuàng)建、綁定、監(jiān)聽、允許接入及接收數(shù)據(jù)等關(guān)鍵代碼及其說明,客戶

10、端請(qǐng)求及數(shù)據(jù)發(fā)送等關(guān)鍵代碼及說明;</p><p>  2 開發(fā)環(huán)境、開發(fā)工具</p><p> ?。?)安裝VWware軟件</p><p> ?、匍_始安裝加載文件.雙擊該文件的圖標(biāo),進(jìn)入加載安裝文件的界面。</p><p> ?、谠O(shè)置安裝類型。安裝文件加載完畢后進(jìn)入開始安裝界面。單擊next按鈕后,進(jìn)入安裝類型選擇界面,選擇tyical選

11、項(xiàng)。</p><p> ?、蹐?zhí)行軟件包的安裝選項(xiàng),依據(jù)所做的選擇,把對(duì)應(yīng)的軟件組件安裝到系統(tǒng)中,輸入正確的序列號(hào)。</p><p> ?。?)配置VMware</p><p>  ①打開桌面上VMware圖形,雙擊打開</p><p> ?、谠俅蜷_原來的文件夾,把漢化包打開</p><p> ?、蹐?zhí)行軟件的安裝選項(xiàng),依

12、據(jù)所做的選擇,確認(rèn)安裝。確認(rèn)完后,即配置完成。</p><p>  ④點(diǎn)擊打開虛擬機(jī),選擇標(biāo)準(zhǔn),下一步,執(zhí)行軟件的安裝選項(xiàng)。接下是密鑰,填寫老師所給的密碼。安裝完成。</p><p><b> ?。?)安裝驅(qū)動(dòng)</b></p><p>  點(diǎn)擊安裝包,根據(jù)軟件的安裝選項(xiàng),點(diǎn)擊next按鈕,即可安裝完成。</p><p>

13、  注:在電腦上安裝好虛擬機(jī)之后配置相關(guān)參數(shù) </p><p> ?、倥渲肗FS:點(diǎn)擊菜單運(yùn)行系統(tǒng)設(shè)置->點(diǎn)擊服務(wù)器設(shè)置->NFS服務(wù)器,點(diǎn)擊增加,在目錄中選擇共享目錄的路徑,在主機(jī)(host)中填入主機(jī)IP地址(192.168.1.12),并選擇客戶對(duì)共享目錄的操作位讀寫(Read/write);在常規(guī)選項(xiàng)中選擇允許來自高于1024的端口的連接,點(diǎn)擊確定后即可配置好NFS。配置完成后,可以簡單測試一

14、下NFS是否配置好了: 在虛擬機(jī)上自己 mount 自己,看是否成功就可以判斷NFS是否配好了。</p><p>  mount 192.168.1.12:/arm2410cl /host</p><p>  之后ls命令查看arm2410cl之下的文件目錄,如果文件目錄在,那么說明NFS配置成功。</p><p><b> ?、诙丝谂渲?lt;/b>

15、;</p><p>  用串口線連接好筆記本電腦和 2410 經(jīng)典版平臺(tái)。 </p><p>  計(jì)算機(jī),屬性,設(shè)備管理器,端口</p><p>  高級(jí)設(shè)置下端口號(hào)COM1</p><p>  進(jìn)入虛擬機(jī)設(shè)置,串行端口</p><p><b>  3設(shè)計(jì)過程及結(jié)果</b></p>

16、<p>  3.1 實(shí)現(xiàn)交叉編譯環(huán)境</p><p><b>  結(jié)果:</b></p><p>  3.2第幾小組成員步驟</p><p><b> ?。?)創(chuàng)建工作目錄</b></p><p>  【root@vm-dev~】# mkdir winter</p><

17、p>  【root@vm-dev winter】# cd winter</p><p>  (2)編寫winter.c文件</p><p>  【root@vm-dev~】# vi winter.c</p><p> ?。?)編寫Makefile文件</p><p>  CC =armv4l-unknown-linux-gcc<

18、/p><p>  EXEC=client server</p><p>  OBJS=client.o server.o</p><p><b>  CFLAGS+=</b></p><p>  LDFLAGS+=-static</p><p>  all:$(EXEC)</p><

19、;p>  $(EXEC):$(OBJS)</p><p>  $(CC) $(LDFLAGS) –o $@ $(OBJS)</p><p><b>  clean:</b></p><p>  -rm –f *.elf *.gdb *.o </p><p><b>  其中,</b><

20、;/p><p><b>  CC 指明編譯器</b></p><p>  EXEC 表示編譯后生成的執(zhí)行文件名稱</p><p>  OBJS 目標(biāo)文件列表</p><p>  CFLAGS 編譯參數(shù)</p><p>  LDFLAGS 連接參數(shù)</p><p>  all:

21、編譯主入口</p><p>  clean: 清除編譯結(jié)果</p><p> ?。?)運(yùn)行make編譯程序</p><p>  【root@vm-dev~】# make clean</p><p>  【root@vm-dev winter】# make</p><p><b> ?。?)源程序 </b

22、></p><p>  #include<stdio.h></p><p>  int main(void)</p><p><b>  {</b></p><p>  printf(“ 通信工程13級(jí)第三小組嵌入式開發(fā)技術(shù)課程設(shè)計(jì)基礎(chǔ)內(nèi)容“);</p><p><b>

23、;  }</b></p><p><b>  6)結(jié)果</b></p><p>  由于電腦與開發(fā)板不匹配,結(jié)果沒有辦法出來</p><p>  3.3實(shí)現(xiàn)Linux系統(tǒng)下的簡易聊天室</p><p><b> ?。?)程序流程圖</b></p><p><

24、b> ?。?)程序工作過程</b></p><p>  服務(wù)端處于監(jiān)聽狀態(tài),客戶端發(fā)送請(qǐng)求,連接成功并通信。首先服務(wù)端調(diào)用socket()函數(shù)創(chuàng)建一個(gè)套接字,然后把協(xié)議,端口號(hào),ip信息通過bind()進(jìn)行綁定。以上操作完后服務(wù)端就開始監(jiān)聽客戶端的請(qǐng)求,并設(shè)置監(jiān)聽的最大數(shù)目。當(dāng)客戶端發(fā)送鏈接請(qǐng)求時(shí),服務(wù)端就調(diào)用accept()函數(shù)接受客戶端的請(qǐng)求。然后對(duì)于客戶端來說,也是要先調(diào)用socket()

25、函數(shù)創(chuàng)建客戶端的套接字,這里是用的TCP協(xié)議,所以可以不用bind()函數(shù)。接著調(diào)用connect()函數(shù)與服務(wù)端建立連接。當(dāng)服務(wù)端和客戶端建立連接時(shí),可以通過彼此之間的套接字描述符來進(jìn)行數(shù)據(jù)傳輸。其中一方通過send函數(shù)把數(shù)據(jù)寫入數(shù)據(jù)緩沖區(qū),另一方通過recv()函數(shù)從緩沖區(qū)內(nèi)讀出數(shù)據(jù),這樣就完成了服務(wù)端與客戶端之間的數(shù)據(jù)傳輸。當(dāng)雙方數(shù)據(jù)傳輸完成后,函數(shù)close()關(guān)閉各自的 套接字,使客戶端和服務(wù)端通信中斷。</p>

26、<p>  (3)socket編程方案</p><p> ?、僭O(shè)計(jì)一個(gè)簡單的聊天室程序,PC運(yùn)行客戶端程序,嵌入式系統(tǒng)運(yùn)行服務(wù)器端程序,服務(wù)器隨時(shí)偵聽客戶端請(qǐng)求并將其接入,要求至少實(shí)現(xiàn)2個(gè)客戶端接入服務(wù)器并進(jìn)行通信的功能;</p><p>  ②Makefile文件</p><p> ?、跱FS將程序下載到實(shí)驗(yàn)箱中,編譯執(zhí)行。</p>&l

27、t;p>  注:程序里的函數(shù)解釋</p><p> ?。?)Socket()</p><p>  作用:socket函數(shù)為客戶機(jī)或服務(wù)器創(chuàng)建一個(gè)sokcet</p><p><b>  格式:</b></p><p>  int socket(int family,int type,int protocol);&l

28、t;/p><p><b>  參數(shù)說明:</b></p><p>  Family:表示地址族,可以去AF_UNLX和AF_INT。</p><p>  其中,AF_UNLX只能夠用于單一的UNIX系統(tǒng)進(jìn)程間通信;AF_INT是針對(duì)Internet的,因而可以允許在遠(yuǎn)程主機(jī)之間通信,實(shí)驗(yàn)中使用AF_INT。</p><p>

29、  Type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流;SOCKE_DGRAM表明使用的是UDP協(xié)議,這樣只會(huì)提供定長、不可靠、無連接的通信。</p><p> ?。?)bind( )</p><p><b>  格式:</b>&l

30、t;/p><p>  int bind(int sockfd,struct sockaddr *addr,int addrlen);</p><p><b>  參數(shù)說明:</b></p><p>  Sockfd:socket的文件描述符號(hào)。</p><p>  Sockaddr:表示名字所用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來保存地址(

31、包括IP地址和端口)</p><p>  Addrlen:設(shè)置結(jié)構(gòu)大小長度。</p><p> ?。?)listen()</p><p><b>  格式:</b></p><p>  int listen(int sockfd, int backlog);</p><p>  作用:監(jiān)聽連接信號(hào)

32、,和accepted函數(shù)合同。</p><p><b>  參數(shù)說明:</b></p><p>  Sockfd:表示socket調(diào)用返回的文件描述符。</p><p>  Backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個(gè),也可以子定義5~10個(gè)。</p><p> ?。?)accept()</p&

33、gt;<p><b>  格式:</b></p><p>  Int accept (int sockfd, void *addr, int *addrlen);</p><p>  作用:與listen函數(shù)合用,監(jiān)聽信息、接收客戶端請(qǐng)求。</p><p><b>  參數(shù)說明:</b></p>

34、<p>  Sockfd:表示socket的文件描述符。</p><p>  Addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)struct sockaddr-in的指針。</p><p>  Addrlen:表示地址的長度。</p><p> ?。?)connect()</p><p><b>  格式:</b></p

35、><p>  int connect( int sockfd , struct sockaddr *serv_addr , int addrlen);</p><p>  作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時(shí)使用,connect必須在bind后使用。</p><p><b>  參數(shù)作用: </b></p><p> 

36、 Sockfd:表示socket的文件描述符。</p><p>  Serv-addr:表示村訪目的端口和ip地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。</p><p> ?。?)send() 和 recv()</p><p><b>  格式1:</b></p><p>  Int send (int sockfd, const vo

37、d *msg,int len, int flags);</p><p><b>  功能:發(fā)送信息。</b></p><p><b>  格式2:</b></p><p>  Int recv (int sockfd , void *buf,int len, usigned int flags);</p>&

38、lt;p>  作用:用于流式socket、數(shù)據(jù)報(bào)socket內(nèi)部之間的通信。</p><p>  (7)close( ) 和 shutdown ( )</p><p><b>  格式:</b></p><p>  Close( int sockfd)</p><p><b>  或 </b>

39、</p><p>  Int shutdown(int sockfd , int f);</p><p><b>  參數(shù)說明:</b></p><p><b>  f的值為下面一種:</b></p><p>  0----不允許繼續(xù)接收;</p><p>  1----不允

40、許繼續(xù)發(fā)送;</p><p>  2---不允許繼續(xù)發(fā)送和接收。</p><p> ?。?)有關(guān)線程的系統(tǒng)調(diào)用函數(shù)pthread_create()、pthread_join()</p><p>  實(shí)驗(yàn)過程說明(使用TCP/IP)</p><p><b>  (1)監(jiān)聽連接</b></p><p>

41、;  利用socket、bind、listen建立連接,步驟是:</p><p>  先用socket函數(shù)初始化socket,創(chuàng)建新的sockfd。</p><p>  Sockfd = socket(AF_INT,SOCK_STREAM,0)</p><p>  此步驟涉及到IP地址及其處理過程。</p><p><b>  參數(shù)

42、說明:</b></p><p>  inet_addr 函數(shù) INADDR_ANY</p><p>  該函數(shù)把由小數(shù)點(diǎn)分開的十進(jìn)制IP地址轉(zhuǎn)為unsinged long 類型,而在實(shí)驗(yàn)中所使用的為INADDR_ANY,使用利用自已的IP地址自動(dòng)填充。</p><p>  a)利用bind函數(shù)綁定端口和IP地址。</p><p>

43、  My_addr.sin_family=AF_INET; /*將地址族類型設(shè)定好 */</p><p>  My_addr.sin_port=htons(MYPORT; /* 將端口給其賦值*/</p><p>  My_addr.sin_addr.s_addr=INADDR_ANY; /*用連接地址自動(dòng)填充ip*/</p><p>

44、  Bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr));</p><p>  /*sockfd 是分配的socket名字,my-addr則便是分配好的端口與IP,用bind綁定*/</p><p>  b)利用listen監(jiān)聽請(qǐng)求</p><p><b>  (2)發(fā)送請(qǐng)求&l

45、t;/b></p><p>  1)利用gethostbyname獲取主機(jī)信息。</p><p>  2)初始化socket端口。</p><p>  3)利用connect函數(shù)將自己的IP地址等信息發(fā)送到主機(jī),等待主機(jī)調(diào)用accept函數(shù)來接受請(qǐng)求。</p><p>  (3)主機(jī)接收請(qǐng)求,進(jìn)行數(shù)據(jù)通信</p><

46、p>  1)主機(jī)利用accept接收請(qǐng)求。</p><p>  2)創(chuàng)建子進(jìn)程,顯示歡迎信息;</p><p>  3)接收返回信息,顯示連接成功,并推出連接;</p><p>  4)關(guān)閉客戶端口socket;</p><p>  5)關(guān)閉服務(wù)端socket,結(jié)束子線程。</p><p><b>  

47、(4)實(shí)現(xiàn)步驟</b></p><p><b> ?、俳⒐ぷ髂夸?lt;/b></p><p>  【root@vm-dev~】# mkdir server</p><p>  【root@vm-dev server】# cd server</p><p>  【root@vm-dev server】# vi s

48、erver.c</p><p>  【root@vm-dev~】# mkdir client</p><p>  【root@vm-dev client】# cd client</p><p>  【root@vm-dev client】# vi client.c</p><p><b> ?、诰帉懗绦蛟创a</b>&l

49、t;/p><p><b>  程序附后</b></p><p><b> ?、劬幾g實(shí)現(xiàn)過程</b></p><p> ?、?在編寫完TCP服務(wù)端程序server.c后,用 armv4l-unknown-</p><p>  linux-gcc –lpthread –o server.c server 生

50、成程序server。</p><p> ?、?在編寫完TCP客戶端程序client.c后,用armv4l-unknown-linux-gcc –o client.c client 生成程序client</p><p> ?、?在嵌入式系統(tǒng)上運(yùn)行server。</p><p>  在主機(jī)上打開一個(gè)窗口,運(yùn)行client,輸入服務(wù)器的IP地址,并檢查器結(jié)果的正確性。&l

51、t;/p><p><b> ?、?輸入:</b></p><p>  # ./server</p><p>  # ./client 192.168.1.12(192.168.1.12為本機(jī)的ip地址) </p><p><b> ?、?輸出:</b></p><p>

52、  #server:got connection from 192.168.1.12</p><p> ?、?客戶端發(fā)送信息服務(wù)器端接收信息。</p><p>  客戶端通過鍵盤輸入消息內(nèi)容平回車,以發(fā)送消息給服務(wù)器端;</p><p><b> ?、?結(jié)果:</b></p><p><b>  服務(wù)端:&l

53、t;/b></p><p><b>  客戶端:</b></p><p><b>  注 :源程序</b></p><p>  client.c程序:</p><p>  #include<stdlib.h></p><p>  #include<sy

54、s/types.h></p><p>  #include<sys/socket.h></p><p>  #include<netinet/in.h></p><p>  #include<arpa/inet.h></p><p>  #include<unistd.h></p&g

55、t;<p>  #include<stdio.h></p><p>  #include<errno.h></p><p>  #include<string.h></p><p>  #define EHCO_PORT 8888 //端口號(hào)</p><p>  #de

56、fine MAX_COMMAND 5 //最大發(fā)送消息的次數(shù)</p><p>  int main()</p><p><b>  {</b></p><p>  int sock_fd;</p><p>  struct sockaddr_in s_addr;</p><p>  

57、char buff[100]; //緩沖區(qū)的大小</p><p>  char tmp_buf[100];</p><p><b>  int n,i;</b></p><p>  sock_fd=socket(AF_INET,SOCK_STREAM,0); //創(chuàng)建socket套接字,協(xié)議為IPV4協(xié)議,并且為字節(jié)流套接

58、字</p><p>  if(sock_fd==-1)</p><p><b>  {</b></p><p>  perror("create socket fail!");</p><p><b>  return 0;</b></p><p><

59、;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("create socket %d\n",sock_fd);</p><p><b>  }</b>

60、;</p><p>  /*設(shè)置server 地址結(jié)構(gòu)*/</p><p>  bzero(&s_addr,sizeof(s_addr)); //初始化結(jié)構(gòu)占用的內(nèi)存</p><p>  s_addr.sin_family=AF_INET; //IPV4協(xié)議</p><p&g

61、t;  s_addr.sin_port=htons(EHCO_PORT); //設(shè)置監(jiān)聽的端口</p><p>  s_addr.sin_addr.s_addr=inet_addr("192.168.0.121"); //設(shè)置服務(wù)器的地址</p><p>  bzero(&(s_addr.sin_zero),8);</p>&

62、lt;p>  if(-1==connect(sock_fd,(struct sockaddr*)&s_addr,sizeof(s_addr)))</p><p><b>  {</b></p><p>  perror("connect() fail!\n");</p><p>  close(sock_fd)

63、;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  printf("connect to server ok !\n");</p><p>  for(i=0;i<MAX_COMMAND;i++)</

64、p><p><b>  {</b></p><p>  printf("請(qǐng)輸入要發(fā)送信息:\n");</p><p>  scanf("%s",buff);</p><p>  printf("發(fā)送信息:%s\n",buff);</p><p&g

65、t;  send(sock_fd,buff,100,0); //發(fā)送數(shù)據(jù)給服務(wù)器</p><p>  n=recv(sock_fd,tmp_buf,100,0); //從服務(wù)器接收數(shù)據(jù)</p><p>  tmp_buf[n]='\0'; // 給字符串添加結(jié)束標(biāo)志</p><p>  printf(&quo

66、t;接收的數(shù)據(jù): %s\n",tmp_buf); //打印接收的字符串</p><p>  if(0==strncmp(tmp_buf,"quit",4)) //判斷是否退出命令</p><p><b>  break;</b></p><p><b>  }</b>&l

67、t;/p><p>  close(sock_fd); //關(guān)閉套接字</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  Server.c:&l

68、t;/b></p><p>  #include<stdlib.h></p><p>  #include<sys/types.h> </p><p>  #include<sys/socket.h></p><p>  #include<netinet/in.h></p>

69、;<p>  #include<arpa/inet.h></p><p>  #include<unistd.h></p><p>  #include<stdio.h></p><p>  #include<errno.h></p><p>  #include<strin

70、g.h></p><p>  #define EHCO_PORT 8888 //定義端口號(hào)</p><p>  #define MAX_CLIENT_NUM 5 //最大監(jiān)聽客戶端數(shù)</p><p>  int main()</p><p><b>  {</b></p

71、><p>  int sock_fd;</p><p>  struct sockaddr_in s_addr; </p><p>  int clientfd;</p><p>  struct sockaddr_in clientAdd;</p><p>  char buff[101];

72、 //設(shè)置緩沖區(qū)的大小</p><p>  socklen_t len;</p><p><b>  int n;</b></p><p>  /*創(chuàng)建socket*/</p><p>  sock_fd=socket(AF_INET,SOCK_STREAM,0);//協(xié)議設(shè)置為IPV4協(xié)議,并設(shè)置為字節(jié)流套接字&

73、lt;/p><p>  if(sock_fd==-1){</p><p>  perror("create socket fail!");</p><p><b>  return 0;</b></p><p><b>  }else{</b></p><p>

74、;  printf(" create socket ok %d\n",sock_fd);</p><p><b>  }</b></p><p>  bzero(&s_addr,sizeof(s_addr)); //初始化結(jié)構(gòu)體占用的內(nèi)存</p><p>  s_addr.sin_family=AF_INET;

75、 //客戶端協(xié)議為IPV4</p><p>  s_addr.sin_port=htons(EHCO_PORT); //把16位值的端口號(hào)從主機(jī)字節(jié)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)</p><p>  s_addr.sin_addr.s_addr=inet_addr("192.168.0.121"); //設(shè)置服務(wù)器地址</p><p>

76、;  bzero(&(s_addr.sin_zero),8);//將內(nèi)存塊的前8個(gè)字節(jié)清零</p><p>  if(bind(sock_fd,(struct sockaddr*)&s_addr,sizeof(s_addr))!=0)</p><p>  {//將服務(wù)器地址和套接字綁定</p><p>  printf("bind fail

77、! %d\n",errno);</p><p>  close(sock_fd);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>&

78、lt;b>  {</b></p><p>  printf(" bind ok!\n");</p><p><b>  }</b></p><p>  if(-1==listen(sock_fd,MAX_CLIENT_NUM))</p><p>  { //設(shè)置套接字監(jiān)聽</p

79、><p>  perror("listen fail!\n");</p><p>  close(sock_fd);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else

80、</b></p><p><b>  {</b></p><p>  printf("listen ok\n");</p><p><b>  }</b></p><p>  len=sizeof(clientAdd); </p>&l

81、t;p>  clientfd=accept(sock_fd,(struct sockaddr*)&clientAdd,&len); //創(chuàng)建新連接對(duì)應(yīng)的套接字</p><p>  if(clientfd<=0)</p><p><b>  {</b></p><p>  perror("accept() f

82、ail!\n");</p><p>  close(sock_fd);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  printf("client connect ok:\n");</p>

83、<p>  while((n=recv(clientfd,buff,100,0))>0)</p><p><b>  {</b></p><p>  buff[n]='\0'; //給字符串加入結(jié)束符</p><p>  printf("the data of receive

84、: %s\n",buff);//打印字符串的內(nèi)容</p><p>  fflush(stdout); //清除文件緩沖區(qū)</p><p>  printf("put the data of send:\n"); </p><p>  scanf("%s",buff);<

85、;/p><p>  send(clientfd,buff,n,0); //發(fā)送內(nèi)容給客戶端</p><p>  printf("the message of send:%s\n",buff);</p><p>  if(strncmp(buff,"quit",4)==0) //判斷是否退出命令</p&

86、gt;<p><b>  break;</b></p><p><b>  }</b></p><p>  close(clientfd); //關(guān)閉新建的連接</p><p>  close(sock_fd); //關(guān)閉服務(wù)端監(jiān)聽的socket</p>

87、<p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  4 設(shè)計(jì)總結(jié)</b></p><p>  在本學(xué)期的最后一周,我們被要求完成嵌入式的設(shè)計(jì)總結(jié),雖然只有不到一周的時(shí)間,但是大家都感覺收獲頗豐。把課堂上遺忘的、遺落的知識(shí)都撿了起

88、來,舊的知識(shí)新的知識(shí)都掌握了很多,并且切實(shí)的體會(huì)到軟件開發(fā)的困難與樂趣,認(rèn)識(shí)到了自己的不足,并且慢慢摸索,不恥下問,在老師和小組成員的共同努力下,結(jié)束了這次的實(shí)踐。</p><p>  此次課程設(shè)計(jì)老師要求我們完成兩道基礎(chǔ)題目,以及一道三選一的綜合題目。前面的基礎(chǔ)題目大家有在課堂上接觸過,并且通過查找資料,大家分工合作一個(gè)上午就有了很大的進(jìn)展,但是在下午的完善工作中還是被卡住了,一個(gè)小的程序調(diào)試不出來,不能出現(xiàn)要

89、求的結(jié)果,最后在其他組一個(gè)同學(xué)的幫助下完成了基礎(chǔ)題目。第二天大家開始做綜合題,經(jīng)過商量選擇了《基于socket編程的簡單聊天室程序設(shè)計(jì)》,其實(shí)三道題目大家都沒有把握能完成,對(duì)這道題比較有興趣就敲定了。開始就是大量的查找資料,因?yàn)榇蠹以谡n堂上學(xué)習(xí)的知識(shí)都太淺,并且大都停留在理論上,沒有開發(fā)經(jīng)驗(yàn),所以大量工作都依靠互聯(lián)網(wǎng),不過因?yàn)槲覀兘M成員的C的能力都挺好,所以能夠?qū)Υa程序理解并修改以及調(diào)試,最終還是盡我們最大努力完成了這次設(shè)計(jì)。<

90、/p><p>  下面整理一下這次課程設(shè)計(jì)中個(gè)人的總結(jié)。</p><p>  齊秀:搜集資料,寫論文</p><p>  這次的實(shí)踐中,我負(fù)責(zé)搜集資料以及論文編撰。在剛拿到題目的時(shí)候,因?yàn)榇蠹叶急容^束手無策,所以就必須要借用別人的東西,加以修改整理變成自己的東西。我查找了很多論文和書籍,然后根據(jù)設(shè)計(jì)要求將可用的東西整理打包給其他人,包括一些代碼和思想,在程序調(diào)試成功后進(jìn)

91、行了總結(jié)并參與撰寫論文。在這中間,我認(rèn)識(shí)到了我們的不足,需要學(xué)習(xí)的東西還有很多。</p><p>  許婷:編寫、調(diào)試程序</p><p>  在這次程序設(shè)計(jì)過程中,我主要參與了客戶端代碼的編寫和數(shù)道是交叉編譯環(huán)境的問題,還有就是串口速率不一致的問題。總而言之,遇到困難千萬不能放棄,要自己搜集資料,詢問同學(xué),不斷嘗試,在一次次失敗中汲取教訓(xùn),從而獲得進(jìn)步。</p><p

92、>  王青青:編寫、調(diào)試程序</p><p>  這次實(shí)驗(yàn)中,我們通過開發(fā)板與電腦相連,將程序下載到開發(fā)板上,進(jìn)行調(diào)試,在下載過程中碰到了minicom老進(jìn)不去,進(jìn)去之后,掛載不上,通過同學(xué)交流,設(shè)置NFS參數(shù),最后掛載上,在調(diào)試socket程序時(shí),程序錯(cuò)誤,沒有辦法執(zhí)行,一遍一遍的讀取程序,最終調(diào)試成功。</p><p><b>  王莉笑:寫報(bào)告</b>&l

93、t;/p><p>  我負(fù)責(zé)的是書寫報(bào)告。報(bào)告并不是最后才寫的,而是在設(shè)計(jì)的過程中一點(diǎn)點(diǎn)添加完善,在實(shí)踐開始先寫了大體框架以及設(shè)計(jì)要求,在大家實(shí)踐的過程中對(duì)流程以及出現(xiàn)的問題、解決方法等進(jìn)行記錄,繪制一些必要的圖表并且對(duì)結(jié)果整理,這些作為核心寫進(jìn)報(bào)告里,最后進(jìn)行總結(jié),并對(duì)全文排版。我在這個(gè)過程中沒有深入了解代碼,這是一個(gè)遺憾。</p><p>  張樂:編寫、調(diào)試程序</p>&

94、lt;p>  在本次嵌入式實(shí)驗(yàn)中,我主要完成的任務(wù)是編寫程序,調(diào)試程序。在實(shí)驗(yàn)過程碰到了很多問題,比如:minicom連接不上,通過計(jì)算機(jī),屬性,端口,進(jìn)行端口與速率設(shè)置,將其設(shè)置成com1,115200.在虛擬機(jī)中也要進(jìn)行設(shè)置,通過 ctrl+A,Z 進(jìn)入?yún)?shù)配置頁面,將tty01改成tty00,將速率改成115200,進(jìn)行保存。之后進(jìn)入minicom 然后進(jìn)行掛載,調(diào)試。由于筆記本的原因,好幾次鍵盤失控,這在實(shí)驗(yàn)中算是碰到的最

95、大問題,好幾次實(shí)驗(yàn)停滯不前,老師也沒有辦法,只能不停的重啟。最后重裝一次,才正常工作。最后完成實(shí)驗(yàn)。</p><p><b>  參考文獻(xiàn)</b></p><p>  孫弋.ARM+Linux嵌入式系統(tǒng)開發(fā)基礎(chǔ)[M].西安:西安電子科技出版社,2008;</p><p>  周留軍,武金磊.基于socket的簡單聊天室的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論