




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一.網絡趙時檢測在網絡通涪過程中,經常會出現不可預知的并種惜況。例如網絡線路突發故障、通缶一方并常結束 等.一H.出現上述情況.很可能長時間都不會收到數據.而£L無法判斷圧沒冇數據還圧數據無法到達。如 果使用的是TCP協議,可以檢測出來:但如果使用UDP協議的話,需要在程序中進行相關檢測。所以, 為避免進程在沒方數據時無限制的阻塞.使用網絡超時檢測很右必要。1. 套接字接收超時檢測這里先介紹設呂套接字選項的丙數setsockopt()函數:所需頭文件#inelude <sys/types.h> #include <sys/socket.h>函數原型int se
2、tsockopt (int sockfd, int level, int optname,const void *optval, socklenj optlen );函數參數sockfd:套接字描述符 level:選項所屈協議層 optvah保存選項值的緩沖區 optlen:選項值的長度函數返回值成功:0出錯:并設置ermo下面是套接字常用選項及瓦說明:LEVEL: SOL SOCKET選項名稱說明數據類型SO.BROADCAST允許發送廣播數據intSO_DEBUG允許調試intSO_DONTRUOTE不査找路由intSO_ERROR獲得套接字借誤intSO.KEEPALIVE保持連槍int
3、SO-LINGER延遲關閉連接struct lin gerSOJDOBINLINE帶外數據放入正常數據流intSO_RCVBUF接收緩沖區大小intSO_SNDBUF發送緩沖區大小intSO.RCVTIMEO接收超時struct timevalSO.SNDTIMEO發送超時struct timevalSO-REUSERADDR允許重用本地地址和端口intSO-TYPE獲得套接字類型int卜M利用SO_RCVTIMEO的選項實現套接字的接收超時檢測:cpp view plain copy1. #include <stdio.h>2. #include <string.h>
4、.3.344.45.46.#include<stdlib.h>include<unistdh>include <sys/typesh>#include <sys/socketh #include <netinet/inh> include <arpa/in皀th> #define N 64#define PORT 88
5、88 int main()(int sockfd;char bufN;struct sockaddr_in seraddr;struct timeval t 6, 0);if(sockfd = socket(AFINET, SOCK_DGRAM, 0) = -1)<perror("socket error"); exit(-l);>elseprintf("socket successfully!nM);printf(-sockfd:%dnH,sockfd);memset(&ser*add, 0, sizeof(seraddr);seraddr.
6、sin_family = AF_INET;seraddr.sin_port htons(PORT);seraddr.sin_addr.s.addr = htonl(INADOR_ANY);if(bind(sockfd, (struct sockaddr t)&seraddr, sizeof(seraddr) = -1)<perror("bind error"); exit(-l);else(printf("bind successfully!n");printf ("PORT:%dnPORT);if(setsockopt(sock
7、fd, SOL.SOCKET, SO.RCVTIHEO, &t, sizeof(t) < 0)4748perror("setsockopt error");49. exit(-l);50. 5152. ifCrecvfromtsockfd, buf, N, 0, NULL, NULL) < 0)53. 54. perror("failto recvfrocn");55. exit(-l);56. 57. else58. 59. printf("recvdata: %snM,buf);60. 61.62. return 0;6
8、3. 執行結果如下:cpp view plain copy111 fsubuntu:/qiang/sovket/time$ ./setsockopt2 socket successfully!p. sockfd:34 bind successfully!5. PORT:88886 fail to recvfrom: Resource temporarily unavailable7 fsubuntu:*/qiang/socket/time$可以看到,6s Z內沒有數據包到來,程序會從recvfrom函數返回,進行相應的借誤處理。 注意:套接字一旦設垃了超時Z垢,毎一次發送或接收時都會檢測,如來
9、要取消超時檢測,重新用 setsockopt函數設呂即可(把時間值指定為0)2、定時器超時檢測這里利用宦時器信號SIGALARM.可以在程序中創建個鬧鐘。當到達目標時間后,指宦的倍號處 理函故被執行.這樣同樣可以利用SIGALARM信號實現檢測.下而分別介紹相關數據類型和函數. struct sigaction是Linux中用來描述信號行為的結構體類型,其定義如下:cpp view plain copy1 struct sigaction23void (l,sa_handler)(int);4. void (wsa sieactionXint. siginfo_t , void );5sigs
10、et.t sa_mask;6int sa_flags;7.void (*sa_restorer) (void);8 sa_handlert此 Lsignal()的*ft handler III同.此I嬰川來小;IH的安叢函效signal。處理形式的支執 sa.sigaction:新的信號安裝機制.被詛用的時燥.不但H以得到信號編號.M且可以獲玄被調用的原岡以 何題的匕下文的相關信息. sa.mask:用來設置在處殲該信號時暫時將sa.mask 定的信號擱跟 sa.restorer:此參數沒<j使用: sajags:用來設豐信號處理的梵他相關操作.下列的故值可用.可用OR運算<|)姐
11、合,YA_NOCLDSTOP:如果參數signum為SIGCHLD.則當子進桎皆停時井不會通知父進程SA.ONESHOT/SA.RESETHAND:當調用新的信號處理用數詢.將此信號處艸方式改為系統預設的方式弘.RESTART:被信號中斷的系統g用金自行X啟SA.NOMASK/SA.NODEFER:在處理此信號未結束前不幵金此信號的再次到來SA_SIGINFO:信號處理函散足帯仔三個參數的sa.sigaction.所需頭文件 include <signal.h>int sigaction(int signum, const struct sigaction *act,函數原型str
12、uct sigaction *oldact);signum:可以指定SIGKILL和SIGSTOP以外豹所有信號act : act繪一個結構體,里面包含信號處理函數的地址、函數傳入值處理方式等信息:oldact :參數oldact肚一個傳11參數.sigaction函數調用成功后,oldact甲而何含以帕對signum信號的處理方式的信息:成功:0函數返回值出錯:1使用定時器信號檢測超時的示例代碼如卜:cpp view plain copy1#include <stdioh>2#include stringh>3include <stdlib.h>4include
13、 <unistd.h>5#include <signalh>6$inelude <sys/typesh>7#include <sys/socketh>8#include <netinet/inh>9并include <arpa/inet h>44.45 2.53.Sdefine N 64
14、 #define PORT 8888void handler(int signo)<printf(-interrupted by SIGALRM'n");int main()<int sockfd;char bufN;struct sockaddr_in seraddr;struct sigaction act;if(sockfd = socket(AF.INET, SOCK.DGRAM, 0)=perror("socket error");exit(-l);elseprintf("socket successfully!nw);pr
15、intf("sockfd:%dnH,sockfd);memset(&seraddr» 0, sizeof(seraddr);seraddr.sin_family = AF.INET;seraddr.sin_port = htons(PORT);seraddr.sin_addr.s.addr htonl(INADOR_ANY);if(bind(sockfd, (struct sockaddr )&seraddr, sizeof(seraddr) = -1)perror("bind error");exit(-l);elseprintf(&q
16、uot;bind successfully!nH);printf("PORT:%drT,PORT);>sigaction(SIGALRM, NULL, &act);actsa_handler = handler;54act.sa_flags &二 SA_RESTART;55. sigaction(SIGALR>b &act$ NULL);56.56. alarfn(6);57. if(recvfrom(sockfd, buf, N» 0, NULL, NULL) < 0)5960. perror("fail to recv
17、fromw);61. ex辻(1);6263.printf("recv data: %sn*buf);64alann(0);65.66return 0;67. 執行結果如下:cpp view plain copy1 fsubuntu:*/qiang/sotket/time$ /alarm2 socket successfully!3 sockfd:34 bind successfully!5. PORT:88886. interrupted by SIGALRM7. fail to recvfrom: Interrupted system call8 fsubuntu:-/qiang
18、/socket/time$二、廣播前面的網絡通信中,采用的都足單播(唯一的發送方和接收方)的方式。很等時候,需要把數據同 時發送給局域網中的所有主機。例如,通過廣播ARP包獲取目標主機的MAC地址。1、廣播地址IP地址用來標識網絡中的一臺主機.IPv4協議用一個32位的無符號數表示網絡地址,包括網絡 號和主機號。子網掩碼表示IP地址中網絡和占幾個字節。對丁一個C類地址來說,子網掩碼為 "毎個網段都有其對應的廣播地址.以C類地址網段192.168.1 x為例其中最小的地址 代表該網段:而虬大的地址55則是該網段中的廣
19、播地址。當我們向這個地址發 送數據包時,該網段中所以的主機都會接收并處理。注總:發送廣播包時,目標IP為廣播地址而目標MAC於2、廣播包的發送和接收廣播包的發送利接收通過UDP套接字實現-D廣播包發送流程如下,創建udp套接字指定目標地址和端口設置套接字選項允許發送廣播包發送數據包 發送廣播包的示例如卜:cpp view plain copy1.#include<stdioh>2.include<stringh>3.”include<stdlib.h>4#include<unistdh>5#include<sys/typesh>6#i
20、nclude<sys/socketh>7.include<netinet/inh>8#include<arpa/ineth>9#define N 6410 define PORT 888811.12 int main()1314. int sockfd;15. int on » 1;16char bufN="This isabroadcast package!17. struct sockaddr_in dstaddr;18.18. if(sockfd » socket(AF.INET, SOCK_DGRAM, 0) »
21、;» -1)19. 20. perror("socketerrorH);21. exit(-l);22. )23. else2526print千(-sotketsuccessfully!nw);27.printf("sockfd:Xdn*sockfd);2829.30memsetC&dstaddr,0, sizeof(dstaddr);31.dstaddr.sin_family= AF.INET;32dstaddr.sin_port=htons(PORT);33 dstaddr.sin_addr.s_addr = inet.addr(H192.168.1.
22、255H); / 192.168.1.x 網段的廣播地址34.35. if(setsockopt(sockfd, SOL.SOCKET, SO.BROADCAST, &om sizeof(on) < 0) 轉接寧默認不允許 發送廣播包.通過桂改SO-BROADCAST達項使能3637.perror("setsockopt error-);38exit(-l);3940.41. while(l)42. 43sendtoCsockfd, buf, N, (struct sockaddr )&dstaddrJ sizeof(dstaddr);44. sleep(l);
23、45. 4647return 0;48. 2).廣播包接收流程 廣播包接收流程如下: 創建U D P套接字 綁定地址接收數據包 接收包示例如下:cpp view plain copy1include <stdio.h>2#include <stringh>3#include <stdlib.h>4include <unistdh>、ffincluae <sys/typesh>6#include <sys/socketh>7#include <netinet/inh>8"include <arpa
24、/ineth>9#define N 6410.#define PORT 88881112 int main()13.(14int sockfd;15char bufNJ;16struct sockaddr_in seraddr;17. socklen_t peerlen = sizeof(seraddr);18.19i#(GocMd - socket(AFINET, SOCK_DGRAM,G) 1)21.perror("socket error");20.2223.24252627.2829303132.337.38394041.4243.4445
25、.46.4748495051.52535455.5657.5859.while(l)exit(-l);elseprintf("socket successfully!nM);printf("sockfd:%dnH,sockfd);memset(&se廠addr, 0, sizeof(seraddr);seraddr.sin_family AF_INET;seraddr.sin_port = htons(PORT);seraddr.sin_addr.s_addr = inet.addr(M55"); /接收方綁定捋地卅if(bind(s
26、ockfd, (struct sockaddr )&seraddr, sizeof(seraddr) -1) perror("bind error");exit(-l);elseprintf("bind successfully!nM);printf(-PORT:%dn%PORT);if(recvfromCsockfd, bufN, 0, (struct sockaddr )&seraddr, &peerlen) < 0)<perror(*fail to recvfrom1*);exit(-l);else<printfC*
27、 %s:%d",inet_ntoa(seraddr.sin_addr),ntohs(seraddr.sin_port); pr intf (,%sn" buf);return 0;執行結果如下cpp plain copy1 fsubuntu:*/qiang/socket/guangbo$ /guangbore2 socket successfully!6034sockfd:3bind successfully!5PORT:8888::56195This is a broadcast package!:56195This is a broa
28、dcast package!.1:56195This is a broadcast package!9:56195This is a broadcast package!.1:56195This is a broadcast package!.1:56195This is a broadcast package!.1:56195This is a broadcast package!.1:56195This is a broadcast package!.1:
29、56195This is a broadcast package!.1:56195This is a broadcast package!.0.1:56195This is a broadcast package!18. 3、組播通過廣播可以很方便地實現發送數據包給局域網中的所有主機。但廣播同樣存在一些問題,例如, 頻緊地發送廣播包造成所以主機數據鏈路層都會接收并交給上層協議處理,也容易引起局域網的網絡風 暴。卜面介紹一種數據包發送方式成為組播或多播。組播可以看成足單播和廣播的這種。當發送組播數 據包時,至丁加入指定務播組的主機數據鏈路層才會處理其他上
30、機任數據鏈路層會11接丟掉收到的數據 包.換句話說,我們可以通過組播的方式和指定的若干主機通信.1、組播地址IPv4地址分為以卜5類。A類地址:最高位為0,主機號占24位,地址范圍從到54B類地址:最高兩位為10,主機號占46位,地址范闈從到191,254,255.254.C類地址:就高3位為110,主機號占8位,地址范附從到54oD類地址:最高4位為1110,地址范用從到54"E類地址保留.其中D類地址唄成為組播地址。毎一個組播地址代表一
31、個多播組。2、組播包的發送和接收組播包的發送和接收也通過UDP套接字實現.1)組播發送流程如下:創建U D P套接字指定目標地址和瑞口發送數據包程序中,緊接著bind有一個setsockopt操作,它的作用是將socket加入一個組播組,因為socket要接 收組播地址的數據,它就必須加入該組播組。結構休struct ip_mreq mreq足該操作的參數,下而於其定義:cpp view plain copystruct ip_mreq/組播組的IP地址./本地某 網紹設備接LI的IP地址。3struct in_addr imr_multiaddr;4struct in_ad
32、dr imr_interface;5.;一臺上機上可能育多塊網代.接入多個不同的子網.imrjnterface 數就定指宦一個待泄的設備接IX告 訴協議棧只想在這個設務所在的子網中加入某個組播組.有了這兩個參數.協議棧就能知逍:在哪個網絡 設備接口上加入哪個組播組.發送組播包的示例代碼如下:cpp view plain copy1include <stdio.h>2.ttinclude <stringh>3tinclude <stdlib.h>4#include <unistdh>5”include <sys/typesh>6ttin
33、clude <sys/socketh>7#include <netinet/inh>8#include <arpa/ineth>9define N 6410.#derine PORT 88882.23.12 int main()int sockfd;char bufN = "This is a multicast package! struct sockaddr_in dstaddr;if(sockfd = socket(AF.INET, SOCK.DGRAM, 0)= perror(&quo
34、t;socket errorH);exit(-l);else心24. printf("socket successfully!nw);26 printf("sockfd:%dnM,sockfd);27. 28.28. memsetC&dstaddr,0,sizeof(dstaddr);29. dstaddr.sin_family= AF.INET;30. dstaddr.sin_port=htons(PORT);31. dstaddr.sin_addr.s_addr inet_addr(H"); 織也l播地33.32. while(l
35、)3536sendtoCsockfd, buf, N, Obstruct sockaddr t)&dstaddr, sizeof(dstaddr);37. sleep(l);38. 3940. return 0;41. 2)組播包接收流程組播包接收流程如下 創建UDP套接字 加入多播組綁定地址和端口接收敷據包組播包接收流程如F:cpp view plain copy1#include <stdioh>2#inelude <stringh>3include <stdlib.h>4.tfinclude <unistdh>5#include &
36、lt;sys/types h>6include <sys/socketh>7include <netinet/inh>8.tfinclude <arpa/ineth>9#define N 6410.define PORT 888811.12.int main()13.14int sock-fd;15.char bufN;16.struct ip.mreq mreqstruct sockaddr_in seraddr,myaddr; socklen_t peerlen = sizeof(seraddr);if(sockfd = socket(AF.INE
37、T, SOCK.DGRAM, 0) = -1) perror("socket error*);exit(-l);elseprintf("socket successfully!nw);printf("sockfd:%dnM,sockfd);memset(&m/eq, 0, sizeof(mreq);mreq. imr_multiaddr. s_addr = inetaddr(M-); 加入*播組,允數據輕珞口處艸抬足汨 播包mreq.imr_interface.s.addr = htonl(INADDR_ANY);if(setsockopt(sockfd, IPPROTO.IP, IP_ADO_MEf1BERSHIP, fimreq, sizeof(mreq) < 0)perror("fail to setsockopf);exit(-l);MmsetC&seraddr 0, siz
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 華為管理會計案例分析
- 管理團隊的方法論
- 實驗室檢測員培訓總結
- 數學規律變化課件
- 互感器檢定培訓
- SYB創業培訓創業計劃書
- 2024屆四川省資陽市安岳縣中考數學猜題卷含解析
- 缺血性多形性室性心動過速的健康宣教
- 有機磷中毒患者護理查房
- 2025租賃合同的承租人負有些義務
- 2024年蜀道集團招聘筆試參考題庫含答案解析
- 初中語文九年級下冊第四單元作業設計單元質量檢測作業
- 2022輔警考試《道路交通安全法》基礎知識題庫(帶答案)
- 液壓仿真技術的現狀及發展趨勢
- nrf2and通路在藥物治療中的作用
- 高考語文復習:詩歌語言鑒賞
- 泌尿外科常見疾病診療指南
- 學校開展“躺平式”教師專項整治工作實施方案心得體會2篇
- 急救物品藥品管理制度-課件
- 蘇教版三年級下冊口算題大全(全冊完整14份)
- 漢語教程第二冊(上)課后習題與講解
評論
0/150
提交評論