999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux環境下的嵌入式系統網絡編程應用

2009-04-29 00:00:00江愛珍
電腦知識與技術 2009年15期

摘要:Linux支持多種類型的套接字地址簇并將其抽象為統一的套接字接口,這一抽象的引入是為了方便互聯網應用程序的編程,也為網絡應用程序之間的數據通信提供了便利。該文從socket基本概念入手,介紹了網絡編程的基本模式及Linux內核對socket的支持。

關鍵詞:Linux;嵌入式;網絡編程

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2009)15-3953-02

Applications of Network Programming in Embedded Linux Systems

JIANG Ai-zhen

(Channel 561 in SARFT,NanChang 330046,China)

Abstract: Linux supports a wide range of types of socket addresses and the abstract cluster as a single socket interface, the introduction of the abstract is for the convenience of Internet application programming, as well as web applications to provide data communications between the convenience. In this paper, starting from the basic concepts of socket, introduced the basic model of network programming and the Linux kernel support for the socket.

Key words: Linux; Embedded; Network programming

1 socket概述

在Linux中的網絡編程是通過socket套接字接口來進行的,這一抽象的引入是為了方便聯網應用程序的編程,在UNIX的BSD版本第一次使用了這種接口,因此他也叫做BSD套接字。應用程序可以使用這種統一接口收發網絡上的數據,網絡的socket數據傳輸是一種特殊的I/O口,socket也是一種文件描述符。套接字的設計符合Linux的習慣,在理想情況下,應將所有可讀寫訪問的對象映射成文件,這樣就可以用普通的文件讀寫操作來處理這些對象了,使通信中的收發可以很容易映射成讀寫操作。在傳輸協議的上下文中,由這類讀寫操作的對象就是通信關系的兩端,他們表示成了套接字。

BSD套接字是一個通用接口,它支持不同的網絡結構,同時也是一個內部進程間通信機制。當一個主機上同時有多個應用程序在運行,他們使用tcp和udp協議進行通信,則傳輸層協議收到數據后將根據端口和套接口區分數據是傳給哪個應用程序。端口是標識傳輸層與應用程序的數據接口,每個端口有一個16位的標識符。套接口是IP地址與端口號的組合,用來標識全網范圍內的唯一一個端口,在tep和udP協議中用來標識一個連接,網絡應用程序之間通過套接口來實現通信。套接字是套接口描述字的簡稱,是整型數字,它與文件描述符共用一段數值空間O_65535。應用程序中使用套接字來調用套接口,套接字可認為是指向套接口的指針,就像文件描述符是指向文件的指針一樣。一個套接字描述了一個鏈接的一個端口,一個socket端點可以用socket地址來描述,socket地址結構由正地址,端口和使用協議組成(TCPorUDP),因此兩個互聯的進程都要有一個描述他們之間連結的套接字。我們也可以把套接字看作為是一種特殊的管道,只是這種管道對于包含的數據量沒有限制。套接字存在于特定的通信域(即地址族)中,只有隸屬于同一地址族的套接字才能建立對話。Linux支持的協議族有AF_INET(IPv4協議)、AF_INET6(IPv6協議)和AF_UNIX(Unix域協議)。

Linux支持多種套接字類型,每種套接字類型對應于創建套接字的應用程序所希望的通信服務類型。同一協議簇可能提供多種服務類型,比如TCP/IP協議族提供的虛電路和數據報就是兩種不同的通信服務類型。TCP/IP中常用的socket類型共有三種,一種是流式socket(SOCK_STREAM),另一種是數據報式socket(SOCK_DGRAM),還有一種是原始socket(SOCK_RAW)。流式socket是一種面向連結的socket,對應于面向連接的TCP服務應用。數據報式socket是一種無連接的socket,對應于無連接的UDP服務。原始套接字接口容許對較低層協議如IP、ICMP直接訪問,常用于檢驗新的協議實現或訪問現有服務中的新設備。

2 網絡編程基本模式

2.1 客戶機/服務器模式

網絡編程的基本模式是Client/Serve:模式,該模式的建立基于以下兩點:

1) 非對等作用;2)通信完全是異步的客戶機/服務器模式在操作過程中采取的是主動請示方式,首先服務器方要先啟動,并根據請示提供相應服務。Server端首先調用socket創建一個一定類型socket,然后通過bind函數將這個socket綁定到一個client知道的端口上,接著server調用Listen函數設置傾聽隊列的長度,為了接收來自client端的請求做準備,然后server調用accept,開始在所綁定的端口傾聽來自client端的連接請求。如果socket被設置成阻塞方式, accept調用將被阻塞,進程被掛起,直到server收到來自client的請求后,accept才返回。Client端通過socket調用創建一個一定類型的socket(應當和server的socket類型相同)。然后調用connect函數向server所在的主機發出連接請求,連接時,需要指定server所在主機的IP地址和server傾聽的端口號,連接的報文包含了client端的初始的序號SYN a和MSS=1460信息(最大數據段的大小)。正在傾聽來自client的連接請求的server收到client的連接請求后,server從accept調用中返回(通常socket是阻塞方式工作的)。server將會向client端發送server端的初始序號SYN b和對client端的SYN a的確認ACK=a+l,還有本端的最大數據MSS當client端接收到server端的回應時,將發出對server請求的ACK=b+1。然后client從connect中返回,返回值是一個打開的socket的描述符,這個描述符和文件的描述符類似,程序可以像使用文件的描述符一樣使用它。稍后,在server端收到client端對其請求的回應時,server將從accept調用返回,返回值也是一個socket的描述符。

2.2 面向連接協議的字節流套接字編程

字節流socket采用的是傳輸控制協議TCP。TCP提供面向連接的流傳輸,面向連接對可靠性的保證首先是它在進行數據傳輸前,必須在信源端和信宿端建立連接。在面向鏈接傳輸的每一個報文都需要接收端確認,未確認的報文被認為是出錯報文。字節流套接字的服務器進程和客戶進程在通信前必須先建立連接,建立連接和通信的步驟如下:

1) 服務進程首先調用Socket()創建一個字節流套接字,并調用bind()將服務器地址捆扎在該套接字上,接著調用listen()監聽連接請求,隨后調用accept()做好與客戶進程建立連接的準備,無連接請求時,服務進程被阻塞;

2) 客戶進程調用Socket()創建字節流套接字,然后調用connect()向服務進程發出連接請求;

3) 當連接請求到來后,服務進程被喚醒,生成一個新的字節流套接字,并用新套接字同客戶進程的套接字建立連接,而服務進程最早生成的套接字則繼續用于監聽網絡上的服務請求;

4) 服務進程和客戶進程通過調用read()和write()交換數據;

5) 服務進程和客戶進程通過調用close()撤消套接字并中斷連接;當選擇SOCK STREAM(字節流)類型的時,sock()系統調用中的參數protocol(協議)總會選中TCP,而UDP則一直用作SOCK DGRAM類型的傳輸協議。

2.3 非連接協議的數據報套接字編程

數據報式socket采用的是用戶數據報協議UDP,它是建立在IP協議之上的,提供無連接數據報傳輸,主要應用在高可靠性、低延遲的局域網上,它的優點是高效率低開銷,不用建立連接和撤銷連接,缺點是不可靠,報文丟失后需重發。數據套接字的服務進程客戶進程通信前不必建立連接,UDP則一直用作SOCKpGRAM類型的傳輸協議,通信的步驟如下:

1) 服務進程首先調用Socket()創建一個數據套接字,并調用bind將服務器地址捆扎在該套接字上,然后調用recvfrom()等待客戶進程發來的請求;

2) 客戶進程在調用SocketQ創建一個數據報套接字后,調用bindU將客戶機地址捆扎在此套接字上,接著調用sendto()向服務進程發送請求,然后調用recvfrom()等待服務進程返回該請求的處理結果;

3) 服務進程在執行客戶進程所請求的任務后,調用sendto()將處理結果返回給客戶進程;

4) 服務進程和客戶進程通過調用close()撤消套接字;

3 Linux內核對socket的支持

確切地說,Linux內核只提供了一個與套接字有關的系統調用,應用程序的所有套接字調用都會映射到這個系統調用上。在Linux內核中的net/socket.c中定義這個函數sys_socketcall(int call,unsigned long *args)。 include/asm/unistd.h中會指派一個數字,該數字會和arch/i386/kernel/entry.s中的系統調用一起添加到表格中。通過調用中。all參數可以說明所指向的那個套接字函數,在include/linux/net.h中定義了可接受的參數SYS_SOCKET, SYS_IND,SYS_CONNECT, SYS_LISTEN等,在用戶空間的函數庫中,帶有特定參數的sys_socketcall調用會映射成某個獨立函數,在內核中若要選中希望調用的那個函數,需要在sys_socketcall函數中用到一條:witch命令如下所示,而在此之前首先要使用copy_from_user()命令將sys_ socketcall()的函數復制到一個向量中,即ensign long a中。

if copy_from user(a,args,nargs(call))

return _EFAULT;

a0=a[0];

al=a[1];

switch(call)

{

case

SYS_SOCKET:

err=sys_socket(a0,al,a[2]);

break;

SYS_BIND:

err=sys_bind(a0,al,a[2]);

break;

SYS_CONNECT:

err=sys_connect(a0,al,a[2]);

break;

為了支持BSD套接字,一個重要的數據結構就是struct socket,它的定義位于

include/linux/net.h中,其定義如下:

struct socket

{

socket statestate;

unsigned long flags;

struct proto_ops *ops;

structmode *inode;

structfasync struct *fasync list;

structfile*file;

structsock*sk;

wait queue head t wait;

shorttype;

unsigned char passcred;};

與早期的內核相比,socket結構己經稍有簡化。state中存儲的是套接字狀態可以取值如下(include/linux/net.h):SS_FREE(不忙)、SSes UNCONNECTED(未連通)、SS_ONNECTING(目前正在連接)、SS_ONNECTED(已連通)、SS_ISCONNECTING(目前正在斷開連接)。flags用以同步訪問,ops指針指向了連通協議(如tcp或udp)在初始化之后的協議運作。就像Linux中的每個文件都有一個mode一樣,每個BSD套接字也分派了一個mode o file中存儲了一個指向該文件結構的指針,這個結構連接了套接字,因此它可以用與指向套接字。如果有進程等待著這個套接字上的事件,也可以通過fasync_list找出該進程。通過sk指針可以使用一個匹配的sock結構。不過,這個sock結構是由BSD套接字之下、特定于協議的套接字初始化的,并且連通到這個指針。字段負責根據用戶空間中的同名套接字調用存儲第二個參數,在Linux內核include/asm/socket.h中定義了可接受的參數。

從上面分析可以看出任何時候通過一個socket來讀寫數據時,都是在使用一個系統調用(system_call)這個調用(例如read或write)跨越了用戶空間應用程序與內核的邊界。另外,在進入內核之前,您的調用會通過C庫來進入內核中的一個通用函數system_call()。從system_call()中,這個調用會進入文件系統層,內核會在這兒確定正在處理的是哪種類型的設備。最后,調用會進入socket層,數據就是在這里進行讀取或進行排隊從而通過socket進行傳輸的。

4 總結

每種網絡協議都提供網絡應用開發接口,TCP/IP協議的應用開發接口的事實標準是socket套接口,開發socket的目的是隱藏網絡底層的復雜結構和協議,使編程人員能夠簡單抽象的對網絡進行操作。socket面向客戶機/服務器模型,針對客戶機/服務器程序提供不同的socket的系統調用函數,客戶端隨機申請一個socket,操作系統為之分配一個隨機socket號;服務器端擁有全局公認的socket號,任何客戶都可以向他發送連接請求和信息請求。進程通信以前,雙方必須各自創建一個端口,否則是沒有辦法在通信前建立聯系的,而socket提供了這種進程間通信的端口。從網絡編程的套接字的分析來看,選擇TCP套接字和選擇UDP套接字編程,在傳輸數據時有著速度、效率和穩定性的差別。TCP編程擁有了可靠的數據連接,UDP不具有。但是在速度方面,UDP編程確優于TCP編程,特別是對于傳輸短消息。基于這兩種通信方式優缺點的考慮,在后續編寫IDU控制應用軟件時,將UDP套接字用于硬件終端對外廣播本地IP地址,使局域網內客戶端軟件識別某臺終端設備,獲取其MAC地址等硬件信息。將TCP套接字用于在客戶端傳輸用戶數據,對硬件終端上的硬件設備進行初始化設置。

參考文獻:

[1] Warren W Gay. Linux Socket Programming by Example. Que(R), April 2000.

[2] Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman. Linux Device Drivers 3rd Edition. Reilly Media Inc,2005.

[3] 孫瓊,嵌入式Linux應用程序開發詳解[M],北京:人民郵電出版社,2006.

[4] 張斌,高波等,Linux網絡編程[M],北京:清華大學出版社,2000.

[5] Linux技術叢書委員會.Linux開發者指南[M].北京:北京希望電子出版社,2008.

主站蜘蛛池模板: 亚洲精品制服丝袜二区| 欧美高清国产| 国产9191精品免费观看| 午夜精品久久久久久久99热下载| 91www在线观看| 久久精品国产一区二区小说| 欧美不卡视频一区发布| 露脸国产精品自产在线播| 国产在线麻豆波多野结衣| 91亚瑟视频| 国产精品毛片一区视频播| 国产丝袜第一页| 四虎国产精品永久一区| 这里只有精品免费视频| 99999久久久久久亚洲| 国产精品性| 亚洲国产精品不卡在线| 91色国产在线| 亚洲视频免费在线看| 国产精品成人一区二区| 日本日韩欧美| 免费国产黄线在线观看| 玩两个丰满老熟女久久网| 91综合色区亚洲熟妇p| Jizz国产色系免费| 日本在线国产| 波多野结衣国产精品| 欧美激情,国产精品| 美女扒开下面流白浆在线试听| 91欧美亚洲国产五月天| 国产免费高清无需播放器| 在线观看国产精美视频| 五月六月伊人狠狠丁香网| 亚洲香蕉在线| 欧美中文字幕一区| 欧美无遮挡国产欧美另类| 久久99热这里只有精品免费看| 国模私拍一区二区| 1级黄色毛片| 国产人碰人摸人爱免费视频| 美女视频黄频a免费高清不卡| 国产精品网曝门免费视频| 国产永久无码观看在线| 在线看片中文字幕| 国产91高跟丝袜| 色网在线视频| 强奷白丝美女在线观看| 热九九精品| 欧美无专区| 国内精自线i品一区202| 女人18毛片久久| 日本在线免费网站| 99re66精品视频在线观看| 成·人免费午夜无码视频在线观看| 中文字幕色站| 最新国产在线| 成人夜夜嗨| 日韩大乳视频中文字幕| 国产成人无码Av在线播放无广告| 九九九九热精品视频| 亚洲av片在线免费观看| 国内熟女少妇一线天| 亚洲精品福利网站| 黄色网站在线观看无码| 久久天天躁狠狠躁夜夜躁| 久久久久久久久久国产精品| 9999在线视频| 欧美成人a∨视频免费观看| 日韩欧美亚洲国产成人综合| 成人小视频网| 亚洲国产综合精品一区| 小说区 亚洲 自拍 另类| 国产成人久视频免费| 亚洲精品卡2卡3卡4卡5卡区| 久久久久亚洲AV成人网站软件| 丝袜美女被出水视频一区| 免费在线色| 亚洲男女在线| 国产成人免费| 亚洲人成人伊人成综合网无码| 女人18毛片一级毛片在线 | 中国特黄美女一级视频|