日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux应用之--网络编程

發(fā)布時(shí)間:2023/12/15 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux应用之--网络编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux網(wǎng)絡(luò)編程

????一:網(wǎng)絡(luò)參考模型參考模型,如下圖所示:

????

????二:TCP/IP協(xié)議

TCP協(xié)議(傳輸控制協(xié)議)和UDP協(xié)議(用戶(hù)數(shù)據(jù)包協(xié)議)是工作在傳輸層的。??其中TCP協(xié)議是面向連接的,UDP是面向無(wú)連接的。以太網(wǎng)協(xié)議是工作在網(wǎng)絡(luò)接口層的,應(yīng)用程序(像tftp,dns等)是工作在應(yīng)用層的。IP協(xié)議工作在網(wǎng)絡(luò)層。一個(gè)以太網(wǎng)包里面含有一個(gè)IP包,一個(gè)IP包里面含有一個(gè)TCP包或者UDP包。

三:socket網(wǎng)絡(luò)編程。

Linux下面的網(wǎng)絡(luò)編程始終是圍繞socket展開(kāi)的。對(duì)于socket的理解,我只能說(shuō)是達(dá)到了表面,也查過(guò)很多資料。說(shuō)是socket類(lèi)似linux下的文件操作。使用socket函數(shù)可以產(chǎn)生一個(gè)socket的描述符,是一個(gè)整形量,后續(xù)的操作都是圍繞這個(gè)整形描述符進(jìn)行的。另外要明白一點(diǎn),網(wǎng)絡(luò)通信無(wú)非就是網(wǎng)絡(luò)間的兩個(gè)進(jìn)程之間的通信。那么他們是靠什么進(jìn)行相互識(shí)別的呢。主要靠?jī)蓚€(gè)參數(shù)一個(gè)是IP,一個(gè)是端口號(hào)。記住這兩個(gè)特性。

產(chǎn)生socket描述符,調(diào)用函數(shù)int?socket(a?,?b?,?c);這個(gè)函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)表征的是協(xié)議類(lèi)型,一般用AF_INET,表示的是IP4,如果以后IP6盛行了,那么就改用AF_INET6就可以了。第二個(gè)參數(shù)是表示創(chuàng)建的socket類(lèi)型,socket類(lèi)型主要有三種,一是流式套接字,用宏SOCK_STREAM表示,第二種是數(shù)據(jù)報(bào)套接字,用宏SOCK_DGRAM表示,第三種是原始套接字。另外注意,SOCK_STREAM針對(duì)的TCP面向連接的通信,SOCK_DGRAM是針對(duì)UDP面向無(wú)連接的通信。至于都三個(gè)參數(shù),其實(shí)也是相關(guān)協(xié)議,一般填0即可。

第二步是配置描述符了。上面已經(jīng)提到過(guò),用來(lái)描述網(wǎng)絡(luò)間進(jìn)程的主要有兩個(gè)參數(shù),一是IP地址,另一個(gè)就是端口號(hào)了,那么對(duì)于一個(gè)剛剛創(chuàng)建的套接字描述符,也是使用IP號(hào)和端口號(hào)來(lái)描述的,而這些描述套接字的東西都用一個(gè)sruct?sockaddr?或者說(shuō)其替代結(jié)構(gòu)?struct?sockaddr_in?來(lái)描述的。因?yàn)檎嬲枋鲆粋€(gè)套接字屬性的是結(jié)構(gòu)sruct?sockaddr_in,所以還得把產(chǎn)生的套接字跟這個(gè)結(jié)構(gòu)相互綁定。當(dāng)然,在綁定之前要對(duì)struct?sockaddr_in?這個(gè)結(jié)構(gòu)進(jìn)行填充。因?yàn)檫@個(gè)結(jié)構(gòu)完全是為了代替struct?sockaddr?而來(lái)的,為了使其大小一致,剩余字節(jié)數(shù)的空間需要填充為0.也就是說(shuō),先要bzero(&addr,sizeof(struct?sockaddr));然后設(shè)置IP號(hào)。如果是服務(wù)器,那么IP指的是將要與其通信的客戶(hù)端IP,如果允許所有IP的客戶(hù)端訪問(wèn),那么就填充INADDR_ANY。否者就填充實(shí)際的IP號(hào)。如果對(duì)于客戶(hù)端,那么填的就是其實(shí)際要訪問(wèn)的服務(wù)器的IP地址了。然而,填充IP地址也不是一件想當(dāng)然的事情。因?yàn)槲覀兤匠R?jiàn)到的IP,都是字符串型的,而在struct?sockaddr_in?這個(gè)結(jié)構(gòu)里面,是用一個(gè)struct?in_addr?來(lái)保存IP地址的。這個(gè)結(jié)構(gòu)里面就只有一個(gè)成員,那就是一個(gè)32位的整形。所以字符型的IP地址和32位的整形IP地址之間就需要轉(zhuǎn)換了。有兩個(gè)函數(shù)是直接針對(duì)這個(gè)轉(zhuǎn)換過(guò)程的。一個(gè)是inet_aton(字符串IP,struct?in_addr?*?addr);這個(gè)函數(shù)是把字符串ip轉(zhuǎn)換成32位整形的函數(shù)。成功返回0.另一個(gè)與之相對(duì)的函數(shù)就是:

char?*inet_ntoa(struct??in_addr?);除了這兩種直接轉(zhuǎn)換之外,還有一種方法。就是利用hostent結(jié)構(gòu)。hostent結(jié)構(gòu)里面有一個(gè)成員,叫做h_addr里面保存的就是32位整形的IP地址。那如何為hostent填充IP地址(使用字符串型的IP)呢?這就需要用另外一個(gè)函數(shù)

struct??hostent?*??gethostbyname(char?*x)?其中的cahr*x表示的是字符型的IP地址或者是字符型的網(wǎng)址。然后再調(diào)用struct?hostent?中的h_addr?即可獲得32位整形ip。介紹完這里,那么對(duì)于struct?sockaddr_in?這個(gè)結(jié)構(gòu)已經(jīng)可以順利填充完了。下面的操作就要分類(lèi)來(lái)進(jìn)行了。如果是服務(wù)器(不論是TCP的還是UDP的)那么調(diào)用bind函數(shù)即可綁定。

Int??bind(a?,?b,?c)a是所要綁定的套接字,是由socket函數(shù)返回的值,b是一個(gè)指針,其指向struct?sockaddr結(jié)構(gòu)。一般把前面提到的已經(jīng)填充好的struct?sockaddr_in?結(jié)構(gòu)用強(qiáng)制轉(zhuǎn)換成(struct?sockaddr?*)即可。第三個(gè)參數(shù)是一個(gè)整形量,用來(lái)描述struct?sockaddr的大小。一般直接用sizeof(struct?sockaddr)或者sizeof(struct?sockaddr_in).這樣就完成了服務(wù)器端的socket描述符與ip地址與端口信息的綁定。如果是客戶(hù)端,那么要分情況了。若是基于TCP的客戶(hù)端,那么就調(diào)用connect函數(shù),將socket描述符與struct?sockaddr_in進(jìn)行綁定。該函數(shù)是這樣的。Int?connect(a,b,c);其參數(shù)完全與前面提到的bind函數(shù)一致。所以這里就不再贅述。如果是基于UDP的客戶(hù)端,那么直接調(diào)用sendto函數(shù)即可,這個(gè)函數(shù)即完成了綁定的作用,又完成了發(fā)送數(shù)據(jù)的作用。其原型為:

Sendto(sockfd,buffer,lenth,0,(struct?sockaddr*)addr?,sizeof(structsockaddr)).第一個(gè)參數(shù)為客戶(hù)端建立的socket描述符,第二個(gè)參數(shù)為發(fā)送緩沖區(qū),第三個(gè)參數(shù)為發(fā)送的字節(jié)數(shù),后面兩個(gè)參數(shù)就不介紹了。

第三步就可以開(kāi)始通信了。當(dāng)然,其實(shí)在第二步中,對(duì)于UDP類(lèi)型的客戶(hù)端,其在配置SOCKET描述符的時(shí)候已經(jīng)在通信了。然后服務(wù)器端再調(diào)用ssize_t?recvfrom(int?sockfd,void?*buf,int?len,unsigned?int?flags,?struct?sockaddr?*from,socket_t?*fromlen);?注意最后一個(gè)參數(shù)是指針即可。若是TCP類(lèi)型的通信。那么服務(wù)器端先調(diào)用listen函數(shù)設(shè)置好最大連接數(shù),然后調(diào)用accept函數(shù)即可,當(dāng)建立好連接之后,可以使用read,write函數(shù)進(jìn)行通信。而對(duì)于客戶(hù)端,需用先調(diào)用connect函數(shù),建立好連接之后既可以用read,write函數(shù),進(jìn)行通信了。

第四步,關(guān)閉套接字描述符。對(duì)于UDP類(lèi)型的,服務(wù)器和客戶(hù)端各有一個(gè)描述符需要關(guān)閉,而對(duì)于TCP類(lèi)型的,服務(wù)器有兩個(gè)套接字需要關(guān)閉,客戶(hù)端有一個(gè)套接字需要關(guān)閉。關(guān)閉使用函數(shù)close即可。

總結(jié)

以上是生活随笔為你收集整理的linux应用之--网络编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。