版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機網(wǎng)絡(luò)編程1. 簡單的 TCP 程序的建立TCP 服務(wù)器端 TCP 客戶端圖 1-1 TCP 整體程序示意圖IPv4 特定套接字地址結(jié)構(gòu)TCP/IP 通用套接字地址結(jié)構(gòu)struct sockaddr_in struct sockaddr sa_family_t sin_family;sa_family_t sa_family;in_port_t sin_port;char sa_data14;struct in_addr sin_addr;unsigned char sin_zero8; 圖 1-2 套接字地址結(jié)構(gòu)1.1 服務(wù)器端程序 /* 相關(guān)頭文件 */ #include <st
2、dio.h> #include <netinet/in.h>#include <sys/socket.h>#include <unistd.h>#include <string.h>int sockfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in serveraddr,clientaddr; serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(1234); serveraddr.sin_addr.s_addr =
3、INADDR_ANY; socklen_t addrlen = sizeof(addr);bind(sockfd,(struct sockaddr *)&serveraddr,addrlen);/* 被動套接字, 兩個隊列 */ listen(sockfd,5);int sock_id = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen); /* 為什么是寫 sock_id? 已鏈接的套接字 是否可以寫 sockfd? 監(jiān)聽套接字*/ write(sock_id,buf,strlen(buf);Close(so
4、ckf id);1.2 客戶端程序#include <stdio.h>#include <netinet/in.h>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>int sockfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in addr;addr.sin_family = AF_INET; addr.sin_port = htons(1234); inet_pton(AF_INET,"
5、127.0.0.1",&addr.sin_addr); connect(sockfd,(struct sockaddr *)&addr,sizeof(addr); char recvBuf100 = 0 ;read(sockfd,recvBuf,sizeof(recvBuf); Close(sockfd);2. 簡單的 UDP 程序的建立圖 2-1 UDP 程序整體架構(gòu)2.1 服務(wù)端程序int sockfd = socket(AF_INET,SOCK_DGRAM,0); struct sockaddr_in servaddr; servaddr.sin_family
6、= AF_INET; servaddr.sin_port = htons(1234); servaddr.sin_addr.s_addr = INADDR_ANY; bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr); struct sockaddr_in cliaddr; socklen_t clilen = sizeof(cliaddr); recvfrom(sockfd,msg,sizeof(msg),0,(struct sockaddr *)&cliaddr,&clilen);2.2 客戶端程序in
7、t sockfd = socket(AF_INET,SOCK_DGRAM,0); struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(1234); inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);/沒有客戶端與服務(wù)器之分 Struct sockaddr_in myaddr; myaddr.sin_family = AF_INET; Myaddr.sin_port = htons(1234);Mya
8、ddr.sin_addr.s_addr = INADDR_ANY; Bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr);char *msg = "Hello World" sendto(sockfd,msg,strlen(msg),0, (struct sockaddr) &servaddr ,sizeof(servaddr);3. 多播程序的建立服務(wù)器端 客戶端圖 3-1 多播網(wǎng)絡(luò)整體架構(gòu)3.1 服務(wù)器端程序int sockfd = socket(AF_INET,SOCK_DGRAM,0); stru
9、ct sockaddr_in srv; srv.sin_family = AF_INET; srv.sin_port = htons(1234); inet_pton(AF_INET,"224.0.0.1",&srv.sin_addr); struct group_req req;req.gr_interface = 0; memcpy(&req.gr_group,&srv,sizeof(srv); setsockopt(sockfd,IPPROTO_IP,MCAST_JOIN_GROUP,&req,sizeof(req); bind(soc
10、kfd,(struct sockaddr*)&srv,sizeof(srv);char buf40 = 0; recvfrom(sockfd,buf,sizeof(buf),0,NULL,0); setsockopt(sockfd,IPPROTO IP,MCAST LEAVE GROUP,&req,sizeof(req);3.2 客戶端程序int sockfd = socket(AF_INET,SOCK_DGRAM,0); struct sockaddr_in srv;srv.sin_family = AF_INET;srv.sin_port = htons(1234); in
11、et_pton(AF_INET,"224.0.0.1",&srv.sin_addr);struct group req req;req.gr_interface = 0; memcpy(&req.gr_group,&srv,sizeof(srv); setsockopt(sockfd,IPPROTO_IP,MCAST_JOIN_GROUP,&req,sizeof(req); int onoff = 1;setsockopt(sockfd,SOL SOCKET,SO REUSEADDR,&onoff,sizeof(onoff);send
12、to(sockfd,msg,strlen(msg),0,(struct sockaddr *)&srv,sizeof(srv); setsockopt(sockfd,IPPROTO IP,MCAST LEAVE GROUP,&req,sizeof(req);4. 網(wǎng)絡(luò)編程涉及的函數(shù)與宏定義函數(shù)int socket(int domain,int type,int protocol);參數(shù) domainPF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 進程通信協(xié)議 PF_INET/AF_INET Ipv4 網(wǎng)絡(luò)協(xié)議PF_INET6/AF_INET6 Ip
13、v6 網(wǎng)絡(luò)協(xié)議 PF_IPX/AF_IPX IPX-Novell 協(xié)議 PF_NETLINK/AF_NETLINK 核心用戶接口裝置 PF_X25/AF_X25 ITU-T X.25/ISO-8208 協(xié)議 PF_AX25/AF_AX25 業(yè)余無線 AX.25 協(xié)議 PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCs PF_APPLETALK/AF_APPLETALK appletalk(DDP) 協(xié)議 PF PACKET/AF PACKET 初級封包接口參數(shù) typeSOCK_STREAM 提供雙向連續(xù)且可信賴的數(shù)據(jù)流,即TCP。支持OOB 機制,在所有數(shù)據(jù)傳送前必須使用co
14、nnect()來建立連線狀態(tài)。SOCK_DGRAM 使用不連續(xù)不可信賴的數(shù)據(jù)包連接 SOCK_SEQPACKET 提供連續(xù)可信賴的數(shù)據(jù)包連接SOCK_RAW 提供原始網(wǎng)絡(luò)協(xié)議存取SOCK_RDM 提供可信賴的數(shù)據(jù)包連接SOCK PACKET 提供和網(wǎng)絡(luò)驅(qū)動程序直接通信。參數(shù) protocol用來指定 socket 所使用的傳輸協(xié)議編號,通常此參考不用管它, 設(shè)為 0 即可功能說明socket 用來建立一個新的 socket,也就是向系統(tǒng)注冊,通知系統(tǒng)建立一 個網(wǎng)絡(luò)通信端口。返回成功則返回 socket 處理代碼,失敗返回 -1。定義函數(shù)int bind(int sockfd,struct so
15、ckaddr * my addr,int addrlen);參數(shù) sockfd調(diào)用 socket 返回的 sockfd參數(shù) my_addrstruct socketaddr_inunsigned short int sin_family; uint16_t sin_port;struct in_addr sin_addr;unsigned char sin_zero8;struct sockaddr sa_family_t sa_family; char sa_data14;參數(shù) addrlen即 sizeof(my addr)功能說明綁定網(wǎng)絡(luò)地址端口給參數(shù) sockfd 。返回成功則返回 0
16、,失敗返回 -1,錯誤原因存于 errno 中。定義函數(shù)int connect (int sockfd,struct sockaddr* serv addr,int addrlen);參數(shù) sockfd調(diào)用 socket 返回的 sockfdstruct socketaddr_instruct sockaddr unsigned short int sin_family;sa_family_t sa_family;參數(shù) servuint16_t sin_port;char sa_data14;struct in_addr sin_addr;unsigned char sin_zero8; ;參
17、數(shù) addrlen即 sizeof(my addr)功能說明連接設(shè)定好的端口和網(wǎng)絡(luò)地址返回成功則返回 0,失敗返回 -1,錯誤原因存于 errno 中。定義函數(shù)int listen(int sockfd,int backlog)參數(shù) sockfd調(diào)用 socket 返回的 sockfd參數(shù) backlog監(jiān)聽等待隊列最大值即 backlog 乘以 1.5,一般情況設(shè)定為 5功能說明監(jiān)聽客戶端的連接返回成功則返回 0,失敗返回 -1,錯誤原因存于 errno 中。定義函數(shù)int accept(int socket,struct sockaddr * addr,int * addrlen);參數(shù)
18、sockfd調(diào)用 socket 返回的 sockfdstruct socketaddr_instruct sockaddr unsigned short int sin_family;sa_family_t sa_family;參數(shù) servuint16_t sin_port;char sa_data14;struct in_addr sin_addr;unsigned char sin_zero8; ;參數(shù) addrlen即 sizeof(my addr)參數(shù) addrlen功能說明接受來自客戶端的連接返回成功則返回 0,失敗返回 -1,錯誤原因存于 errno 中。定義函數(shù)int recv
19、from(int socket,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);參數(shù) sockfd調(diào)用 socket 返回的 sockfd參數(shù) buf接受數(shù)據(jù)保存的內(nèi)存池參數(shù) len接受數(shù)據(jù)的長度參數(shù) flags參數(shù) flags 一般設(shè) 0,其他數(shù)值定義請參考 recv()參數(shù) from發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)地址與端口參數(shù) fromlen網(wǎng)絡(luò)地址結(jié)構(gòu)體長度功能說明接受來自對端的數(shù)據(jù)返回成功則返回接收到的字符數(shù),失敗則返回-1,錯誤原因存于 errno 中。定義函數(shù)int sendto ( int so
20、ckfd , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen )參數(shù) sockfd調(diào)用 socket 返回的 sockfd參數(shù) msg發(fā)送數(shù)據(jù)保存的內(nèi)存池參數(shù) len發(fā)送數(shù)據(jù)的長度參數(shù) flags參數(shù) flags 一般設(shè) 0,其他數(shù)值定義請參考 send()參數(shù) to對端數(shù)據(jù)的網(wǎng)絡(luò)地址與端口參數(shù) fromlen網(wǎng)絡(luò)地址結(jié)構(gòu)體長度功能說明發(fā)送本段的數(shù)據(jù)返回成功則返回實際傳送出去的字符數(shù), 失敗返回 1,錯誤原因存于 errno 中。定義函數(shù)int setsockopt(in
21、t sockfd,int level,int optname,const void * optval , socklen toptlen) ;參數(shù) sockfd調(diào)用 socket 返回的 sockfd參數(shù) level參數(shù) level 代表欲設(shè)置的網(wǎng)絡(luò)層, 一般設(shè)成 SOL_SOCKET 以存取 socket 層。參數(shù) optname 代表欲設(shè)置的選項,有下列幾種數(shù)值 :SO_DEBUG 打開或關(guān)閉排錯模式SO_REUSEADDR 允許在 bind ()過程中本地地址可重復使用 SO_TYPE 返回 socket 形態(tài)。SO_ERROR 返回 socket 已發(fā)生的錯誤原因SO DONTROUT
22、E 送出的數(shù)據(jù)包不要利用路由設(shè)備來傳輸。SO_BROADCAST 使用廣播方式傳送SO_SNDBUF 設(shè)置送出的暫存區(qū)大小SO_RCVBUF 設(shè)置接收的暫存區(qū)大小 SO_KEEPALIVE 定期確定連線是否已終止。SO_OOBINLINE 當接收到 OOB 數(shù)據(jù)時會馬上送至標準輸入設(shè)備 SO LINGER 確保數(shù)據(jù)安全且可靠的傳送出去。參數(shù) optval代表需要設(shè)的參數(shù)值(太多,沒有列舉)參數(shù) optlen為 optval 的長度。功能說明用來設(shè)置參數(shù) sockfd 所指定的 socket 狀態(tài)返回成功則返回 0,失敗返回 -1,錯誤原因存于 errno 中。附錄:問題列表附錄1. socke
23、t意義向內(nèi)核申請一個網(wǎng)絡(luò)套接字,類似文件描述符2. 服務(wù)端設(shè)定端口地址的意義 指定對方的端口和 IP 地址。3. 為什么要 bind服務(wù)端 TCP 需要監(jiān)聽本地端口,需要標記本地端口和地址給 sockfd,并在內(nèi)核 中申請資源。4. 監(jiān)聽服務(wù)器端需要監(jiān)聽 sockfd,將其轉(zhuǎn)換為被動連接的網(wǎng)絡(luò)套接字, (創(chuàng)建的時候默 認是主動連接的),在監(jiān)聽之際,會維護兩個隊列,一個已完成連接的隊列,一 個未完成連接的隊列,當客戶端 connect 時,發(fā)送一個 SYN 給服務(wù)器端,監(jiān)聽 往未完成的隊列中添加一項,然后返回一個 ACK 應(yīng)答,客戶端重新返回一個應(yīng) 答 ACK ,這樣連接建立,將該項從未完成移動
24、到已完成隊列末尾, accept 函數(shù) 只要已完成隊列有項就會被喚醒。 listen第二個參數(shù)代表這兩個列總長度 / 1.55. accept兩個 sockfd、sock_id 關(guān)系 一個用來監(jiān)聽本地端口,一個是新創(chuàng)建的虛擬的客戶端網(wǎng)路套接字6. 為什么客戶端不需要 bind 客戶端是主動連接服務(wù)器,不需要綁定本地端口和 IP7. 客戶端的 sockaddr_in ? 代表他需要連接的服務(wù)器的地址和端口,并不是自己的8. recvfrom 的 clientaddr 什么意思?這是從對端的端口和 IP ,不關(guān)心客戶端是誰連接,可以直接寫 0,但是服務(wù)器端 不保存客戶端地址的話,無法回發(fā)數(shù)據(jù)9.
25、為什么 UDP 服務(wù)器端需要 bind 同樣的,作為服務(wù)器,是需要被動接收數(shù)據(jù),所以需要標記自己的端口和IP 等給本地 sockfd10. 為什么 UDP 客戶端不需要 bind 因為他是主動去連接服務(wù)器,只要知道服務(wù)器的端口和 IP 即可連接,雖然這樣 做可以行得通,但是從軟件工程的角度, UDP 沒有特定的服務(wù)器端和客戶端,(網(wǎng) 絡(luò)視頻莫非也這樣不區(qū)分?,應(yīng)該是不需要往回發(fā)送數(shù)據(jù))11. 什么是多播 當任何一個程序加入一個多播組時, 他可以往這個組中發(fā)送數(shù)據(jù), 也將接受到來 自這個組任何成員的數(shù)據(jù) (包括自己往組中發(fā)送的數(shù)據(jù), 可以關(guān)閉)。多播是 UDP 連接12. 多播 bind 的意義
26、 只要是加入多播的程序,都是平等的成員,沒有所謂特定的服務(wù)器端和客戶端, 因為都需要接受來自多播組的數(shù)據(jù), 也可以往多播組自中發(fā)送數(shù)據(jù), 所以需綁定 多播地址,以便從多播地址發(fā)送和接受數(shù)據(jù),所以多播程序都需要 bind 多播地 址,從 UDP 角度來講,客戶端不需要 bind,但是多播雖然每一個都是客戶端, 但是都也會被動接受數(shù)據(jù),所以要 bind圖 1-1 OSI 模型1. NetWork Basic1.1 OSI 模型網(wǎng)絡(luò)基礎(chǔ)首先需要知道的就是 OSI 模型,這是理論上的 INETNET 模型應(yīng)用層: 上層應(yīng)用網(wǎng)絡(luò)編程接口表示層: 關(guān)注對等實體間交換數(shù)據(jù)格 式(int16,int32,in
27、t64 ,以及 little endian 和 big endian ) 會話層: 提供一個類似命名空間,將 一個應(yīng)用各部分不同傳輸流聯(lián)系 在一起,比如視頻流和音頻流 傳輸層 : 進程到進程的信道(消息, 網(wǎng)關(guān)) 網(wǎng)絡(luò)層:路由選擇(分組、路由器) 數(shù)據(jù)鏈路層:比特流組成幀 (網(wǎng)絡(luò)適配器、 驅(qū)動程序、 Hub ) 物理層:物理通信鏈路上的原始比特 傳輸1.2 因特網(wǎng)體系結(jié)構(gòu), TCP、IP 模型(沙漏模型)TCP和 UDP提供邏輯信 道,從端到端( end to end)特點:1.沒有嚴格的劃分層 次,比較自由2. 沙漏模型,以 IP 為核 心定義網(wǎng)絡(luò)中交換分組的 一種共同方法1.3 網(wǎng)際協(xié)議族
28、OSI 模型僅僅只是學術(shù)上、理論上的模型,在真正的 Internet 應(yīng)用上,將應(yīng) 用層、表示層、會話層合并為一層,提供套接字供用戶進行編程,傳輸層提供 TCP、UDP 協(xié)議族,網(wǎng)絡(luò)層提供 IP 供上層使用,數(shù)據(jù)鏈路層與物理層即設(shè)備與 設(shè)備驅(qū)動程序。圖 1-2 網(wǎng)際協(xié)議族2. TCP 協(xié)議與 TCP編程2.1 TCP 協(xié)議略解TCP 是可靠的、可流量控制的、排序的、全雙工的網(wǎng)絡(luò)網(wǎng)際協(xié)議。 可靠性TCP 當往另一端發(fā)送數(shù)據(jù)時需要對端返回一個確認, 如果在一定時間沒有收TCP到確認, TCP 將會自動重傳數(shù)據(jù)并等待更長時間,直到數(shù)次重傳失敗之后、 才選擇放棄,一般為 410 分鐘 流量可控TCP 還有動態(tài)估算客戶端與服務(wù)器端往返時間 (RTT,round-trip time )的算 法,以便估算等待一個確認需要多長時間 排序TCP 會對自己發(fā)出的每一個字節(jié)關(guān)聯(lián)一個序列號, 當這些數(shù)據(jù)為非順序發(fā)送 過去時,接受端 TCP 將會對數(shù)據(jù)進行排序重
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版星巴克加盟店設(shè)備維護合同
- 個人影視作品版權(quán)轉(zhuǎn)讓合同(2024版)3篇
- 2024示范文本:二手車買賣合同車輛安全檢測規(guī)范2篇
- 2024試乘試駕活動電子合同范本12篇
- 2025年度二手吊車評估與交易中介合同3篇
- 項目建議書(含設(shè)計任務(wù)書)及可行性研究報告編制技術(shù)咨詢合同模板
- 2025年度碼頭船舶??颗c貨物倉儲一體化租賃合同4篇
- 2025年度臨時醫(yī)療護理人員派遣服務(wù)合同4篇
- 2025年稅務(wù)顧問服務(wù)合同協(xié)議書適用于企業(yè)集團6篇
- 眾維重工2025年度鋼結(jié)構(gòu)建筑工程智能化控制系統(tǒng)采購合同2篇
- 《穿越迷宮》課件
- 《C語言從入門到精通》培訓教程課件
- 2023年中國半導體行業(yè)薪酬及股權(quán)激勵白皮書
- 2024年Minitab全面培訓教程
- 社區(qū)電動車棚新(擴)建及修建充電車棚施工方案(純方案-)
- 項目推進與成果交付情況總結(jié)與評估
- 鐵路項目征地拆遷工作體會課件
- 醫(yī)院死亡報告年終分析報告
- 建設(shè)用地報批服務(wù)投標方案(技術(shù)方案)
- 工會工作人年度考核個人總結(jié)
- 上海民辦楊浦實驗學校初一新生分班(摸底)語文考試模擬試卷(10套試卷帶答案解析)
評論
0/150
提交評論