


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、TCP客戶端計算機網(wǎng)絡編程1. 簡單的TCP程序的建立TCP服務器端圖1-1 TCP整體程序示意圖TCP/IP通用套接字地址結(jié)構(gòu) struct sockaddr sa_family_t sa_family; char sa_data14;IPv4特定套接字地址結(jié)構(gòu)struct sockaddr_in sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr;unsigned char sin_zero8; 圖1-2套接字地址結(jié)構(gòu)1.1服務器端程序/*相關(guān)頭文件*/#i nclude <stdio.h>#i
2、 nclude <n eti net/in .h>#i nclude <sys/socket.h>#i nclude <uni std.h>#include <string.h>int sockfd = socket(AFNET,SOCK_STREAM,0); struct sockaddr_i n serveraddr,clie ntaddr; serveraddr.sin_family = AF_INET;serveraddr.s in _port = hton s(1234); serveraddr.sin_addr.s_addr = IN
3、ADDR_ANY; sockle n_t addrle n = sizeof(addr);bin d(sockfd,(struct sockaddr *)&serveraddr,addrle n);/* 被動套接字,兩個隊列*/liste n(sockfd,5);int sock_id = accept(sockfd,(struct sockaddr *)&clie ntaddr,&addrle n);/*為什么是寫sock_id ?已鏈接的套接字是否可以寫sockfd ?監(jiān)聽套接字*/write(sock_id,buf,strle n( buf);Close(sock
4、f_id);1.2客戶端程序#i nclude <stdio.h>#i nclude <n eti net/in .h>#i nclude <sys/socket.h>#in clude <arpa/i net.h>#i nclude <uni std.h>int sockfd = socket(AFNET,SOCK_STREAM,0); struct sockaddr_i n addr;addr.sin_family = AF_INET;addr.sin_port = hto ns(1234);in et_pto n(AF_INET
5、,"",&addr.sin_addr);conn ect(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服務端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);struct sockaddr_i n servaddr;servaddr.s in _
6、family = AF_INET;servaddr.s in _port = hton s(1234);servaddr.sin_addr.s_addr = INADDR_ANY;bin d(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr);struct sockaddr_i n cliaddr;sockle n_t clile n = sizeof(cliaddr);recvfrom(sockfd,msg,sizeof(msg),0,(struct sockaddr *)&cliaddr,&clilen);2.2
7、客戶端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);struct sockaddr_i n servaddr;servaddr.s in _family = AF_INET;servaddr.s in _port = hton s(1234);in et_pto n(AF_INET,"",&servaddr.sin_addr);/沒有客戶端與服務器之分Struct sockaddr_i n myaddr;myaddr.sin_family = AF_INET;Myaddr.sin_port = hto ns(
8、1234);Myaddr.sin_addr.s_addr = INADDR_ANY;Bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr);char *msg = "Hello World"sen dto(sockfd,msg,strle n( msg),0, (struct sockaddr)&servaddr ,sizeof(servaddr);3. 多播程序的建立客戶端設置socket加入多播r*i設置socket加入多播Bi nd端口J1r1FRecvfrom 數(shù)據(jù)LJ數(shù)據(jù)L;創(chuàng)建socket創(chuàng)建s
9、ocket1 F圖3-1多播網(wǎng)絡整體架構(gòu)服務器端3.1服務器端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0); struct sockaddr_i n srv;srv.sin_family = AF_INET;srv.sin_port = ht on s(1234);in et_pto n(AF_INET,"",&srv.sin_addr); struct group_req req;req.gr_i nterface = 0;memcpy(&req.gr_group,&srv,sizeof(s
10、rv);setsockopt(sockfd,IPPROTOP ,MCAST_JOIN_GROUP,&req,sizeof(req); bin d(sockfd,(struct sockaddr* )&srv,sizeof(srv);char buf40 = 0;recvfrom(sockfd,buf,sizeof(buf),0,NULL,0);setsockopt(sockfd,IPPROTOP ,MCAST_LEAVE_GROUP,&req,sizeof(req);3.2客戶端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);str
11、uct sockaddr_i n srv;srv.sin_family = AF_INET;srv.sin_port = ht on s(1234);in et_pto n(AF_INET,"",&srv.sin_addr);struct group_req req;req.gr_i nterface = 0;memcpy(&req.gr_group,&srv,sizeof(srv);setsockopt(sockfd,IPPROTOP ,MCAST_JOIN_GROUP,&req,sizeof(req); int onof
12、f = 1;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on off,sizeof(o noff);sen dto(sockfd,msg,strle n(msg),O,(struct sockaddr *)&srv,sizeof(srv);setsockopt(sockfd,IPPROTOP ,MCAST_LEAVE_GROUP,&req,sizeof(req);4. 網(wǎng)絡編程涉及的函數(shù)與宏定義函數(shù)int socket(i nt doma in ,i nt type,i nt protocol);PF_UNIX/PF_LOCAL
13、/AF_UNIX/AF_LOCAL UNIX進程通信協(xié)議PF_INET/AF_INET Ipv4網(wǎng)絡協(xié)議PF_INET6/AF_INET6 Ipv6網(wǎng)絡協(xié)議PF_IPX/AF_IPX IPX-Novell 協(xié)議PF_NETLINK/AF_NETLINK 核心用戶接口裝置參數(shù)domainPF_X25/AF_X25 ITU-T X.25/ISO-8208協(xié)議PF_AX25/AF_AX25 業(yè)余無線 AX.25 協(xié)議PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCsPF_APPLETALK/AF_APPLETALK appletalk(DDP)協(xié)議PF_PACKET/AF_PACKE
14、T 初級封包接口SOCK_STREAM 提供雙向連續(xù)且可信賴的數(shù)據(jù)流,即TCP。支持OOB機制,在所有數(shù)據(jù)傳送前必須使用connect()來建立連線狀態(tài)。參數(shù)typeSOCK_DGRAM 使用不連續(xù)不可信賴的數(shù)據(jù)包連接SOCK_SEQPACKET提供連續(xù)可信賴的數(shù)據(jù)包連接SOCK_RAW提供原始網(wǎng)絡協(xié)議存取SOCK_RDM提供可信賴的數(shù)據(jù)包連接SOCK_PACKET提供和網(wǎng)絡驅(qū)動程序直接通信。參數(shù) protocol用來指定socket所使用的傳輸協(xié)議編號,通常此參考不用管它,設為0即可功能說明socket用來建立一個新的socket,也就是向系統(tǒng)注冊,通知系統(tǒng)建立一個網(wǎng)絡通信端口。返回成功則返
15、回socket處理代碼,失敗返回-1。定義函數(shù)int bin d(i nt sockfd,struct sockaddr * my_addr,i nt addrle n);參數(shù) sockfd調(diào)用socket返回的sockfdstruct socketaddr_ instruct sockaddr un sig ned short intsa_family_t sa_family;sin_family;參數(shù) my_addruin t16_t sin _port;char sa_data14;struct in _addr sin _addr;un sig ned char sin _zero8;
16、參數(shù) addrlen即 sizeof(my_addr)功能說明綁定網(wǎng)絡地址端口給參數(shù)sockfd。返回成功則返回0,失敗返回-1,錯誤原因存于 errno中。定義函數(shù)int conn ect (i nt sockfd,struct sockaddr * serv_addr,i nt addrle n);參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù)servstruct socketaddr_ inun sig ned short int sin_family;uin t16_t sin _port;struct in _addr sin _addr;un sig ned char s
17、in _zero8; ;struct sockaddr sa_family_t sa_family; char sa_data14;參數(shù) addrlen即 sizeof(my_addr)功能說明連接設定好的端口和網(wǎng)絡地址返回成功則返回0,失敗返回-1,錯誤原因存于 errno中。定義函數(shù)int liste n(i nt sockfd,i nt backlog)參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù) backlog監(jiān)聽等待隊列最大值即backlog 乘以1.5,一般情況設疋為5功能說明監(jiān)聽客戶端的連接返回成功則返回0,失敗返回-1,錯誤原因存于 errno中。定義函數(shù)int a
18、ccept(i nt socket,struct sockaddr * addr,i nt * addrle n);參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù)servstruct socketaddr_ inun sig ned short int sin_family;uin t16_t sin _port;struct in _addr sin _addr;un sig ned char sin _zero8; ;struct sockaddr sa_family_t sa_family; char sa_data14;參數(shù) addrlen即 sizeof(my_addr)參
19、數(shù) addrlen功能說明接受來自客戶端的連接返回成功則返回0,失敗返回-1,錯誤原因存于 errno中。定義函數(shù)int recvfrom(i nt socket,void *buf,i nt len,un sig ned int flags ,struct sockaddr *from ,int *fromle n);參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù)buf接受數(shù)據(jù)保存的內(nèi)存池參數(shù) len接受數(shù)據(jù)的長度參數(shù) flags參數(shù)flags 一般設0 ,其他數(shù)值疋義請參考recv()參數(shù) from發(fā)送數(shù)據(jù)的網(wǎng)絡地址與端口參數(shù) fromlen網(wǎng)絡地址結(jié)構(gòu)體長度功能說明接受來自對端
20、的數(shù)據(jù)返回成功則返回接收到的字符數(shù),失敗則返回-1,錯誤原因存于 errno中。定義函數(shù)int sen dto ( int sockfd , const void * msg, int len, un sig ned int flags, conststruct sockaddr * to , int tole n )參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù) msg發(fā)送數(shù)據(jù)保存的內(nèi)存池參數(shù) len發(fā)送數(shù)據(jù)的長度參數(shù) flags參數(shù)flags 一般設0 ,其他數(shù)值疋義請參考send()參數(shù)to對端數(shù)據(jù)的網(wǎng)絡地址與端口參數(shù) fromlen網(wǎng)絡地址結(jié)構(gòu)體長度功能說明發(fā)送本段的數(shù)據(jù)返回
21、成功則返回實際傳送出去的字符數(shù),失敗返回一1,錯誤原因存于errno中。定義函數(shù)int setsockopt(i nt sockfd,i nt level,i nt opt name,c onst void * optval , socklen_toptlen);參數(shù) sockfd調(diào)用socket返回的sockfd參數(shù)level代表欲設置的網(wǎng)絡層,一般設成SOL_SOCKET以存取socket參數(shù)level層。參數(shù)opt name 代表欲設置的選項,有下列幾種數(shù)值:SO_DEBUG打開或關(guān)閉排錯模式SO_REUSEADDR 允許在bind ()過程中本地地址可重復使用SO_TYPE 返回 so
22、cket 形態(tài)。SO_ERROR返回socket已發(fā)生的錯誤原因SO_DONTROUTE 送出的數(shù)據(jù)包不要利用路由設備來傳輸。SO_BROADCAST 使用廣播方式傳送SO_SNDBUF設置送出的暫存區(qū)大小SO_RCVBUF設置接收的暫存區(qū)大小SO_KEEPALIVE定期確定連線是否已終止。SO OOBINLINE 當接收到OOB數(shù)據(jù)時會馬上送至標準輸入設備SO LINGER確保數(shù)據(jù)安全且可靠的傳送出去。參數(shù) optval代表需要設的參數(shù)值(太多,沒有列舉)參數(shù)optlen為optval的長度。功能說明用來設置參數(shù)sockfd所指疋的socket狀態(tài)返回成功則返回0,失敗返回-1,錯誤原因存于
23、 errno中。附錄:問題列表附錄1. socket 意義向內(nèi)核申請一個網(wǎng)絡套接字,類似文件描述符2. 服務端設定端口地址的意義指定對方的端口和 IP 地址。3. 為什么要 bind服務端 TCP 需要監(jiān)聽本地端口,需要標記本地端口和地址給 sockfd ,并在內(nèi)核 中申請資源。4. 監(jiān)聽服務器端需要監(jiān)聽 sockfd ,將其轉(zhuǎn)換為被動連接的網(wǎng)絡套接字, (創(chuàng)建的時候默 認是主動連接的),在監(jiān)聽之際,會維護兩個隊列,一個已完成連接的隊列,一 個未完成連接的隊列,當客戶端 connect 時,發(fā)送一個 SYN 給服務器端,監(jiān)聽 往未完成的隊列中添加一項,然后返回一個 ACK 應答,客戶端重新返回
24、一個應 答 ACK ,這樣連接建立,將該項從未完成移動到已完成隊列末尾, accept 函數(shù) 只要已完成隊列有項就會被喚醒。 listen 第二個參數(shù)代表這兩個列總長度 / 1.55. accept 兩個 sockfd 、 sock_id 關(guān)系 一個用來監(jiān)聽本地端口,一個是新創(chuàng)建的虛擬的客戶端網(wǎng)路套接字6. 為什么客戶端不需要 bind 客戶端是主動連接服務器,不需要綁定本地端口和 IP7. 客戶端的 sockaddr_in ?代表他需要連接的服務器的地址和端口,并不是自己的8. recvfrom 的 clientaddr 什么意思?這是從對端的端口和IP,不關(guān)心客戶端是誰連接,可以直接寫0
25、,但是服務器端 不保存客戶端地址的話,無法回發(fā)數(shù)據(jù)9. 為什么 UDP 服務器端需要 bind 同樣的,作為服務器,是需要被動接收數(shù)據(jù),所以需要標記自己的端口和 IP 等 給本地 sockfd10. 為什么 UDP 客戶端不需要 bind因為他是主動去連接服務器,只要知道服務器的端口和 IP 即可連接,雖然這樣 做可以行得通,但是從軟件工程的角度, UDP 沒有特定的服務器端和客戶端, (網(wǎng)絡視頻莫非也這樣不區(qū)分?,應該是不需要往回發(fā)送數(shù)據(jù))11. 什么是多播當任何一個程序加入一個多播組時, 他可以往這個組中發(fā)送數(shù)據(jù), 也將接受到來 自這個組任何成員的數(shù)據(jù) (包括自己往組中發(fā)送的數(shù)據(jù), 可以關(guān)
26、閉)。多播是 UDP 連接12. 多播 bind 的意義只要是加入多播的程序,都是平等的成員,沒有所謂特定的服務器端和客戶端, 因為都需要接受來自多播組的數(shù)據(jù), 也可以往多播組自中發(fā)送數(shù)據(jù), 所以需綁定 多播地址,以便從多播地址發(fā)送和接受數(shù)據(jù),所以多播程序都需要 bind 多播地 址,從 UDP 角度來講,客戶端不需要 bind ,但是多播雖然每一個都是客戶端, 但是都也會被動接受數(shù)據(jù),所以要 bind圖1-1 OSI模型1. Network Basic1.1 OSI模型網(wǎng)絡基礎(chǔ)首先需要知道的就是 OSI模型,這是理論上的INETNET模型應用層:上層應用網(wǎng)絡編程接口表示層:關(guān)注對等實體間交換
27、數(shù)據(jù)格式(int16,int32,int64,以及 little endian 禾口 big endian)會話層:提供一個類似命名空間,將 一個應用各部分不同傳輸流聯(lián)系 在一起,比如視頻流和音頻流 傳輸層:進程到進程的信道(消息, 網(wǎng)關(guān)) 網(wǎng)絡層:路由選擇(分組、路由器) 數(shù)據(jù)鏈路層:比特流組成幀(網(wǎng)絡適配器、 驅(qū)動程序、Hub)物理層:物理通信鏈路上的原始比特 傳輸1.2因特網(wǎng)體系結(jié)構(gòu),TCP、IP模型(沙漏模型)SMTP HTTP RTPcopper fiber radioerniJ WWW phone.TCP UDPether net PPF<XTCP和UDP提供邏輯信 道,從端
28、到端(end to end)特點:1. 沒有嚴格的劃分層 次,比較自由2. 沙漏模型,以IP為核 心定義網(wǎng)絡中交換分組的 一種共同方法1.3網(wǎng)際協(xié)議族OSI模型僅僅只是學術(shù)上、理論上的模型,在真正的In ternet應用上,將加權(quán)0護應用層、表示層、會話層合并為一層,提供套接字供用戶進行編程,傳輸層提供 TCP、UDP協(xié)議族,網(wǎng)絡層提供IP供上層使用,數(shù)據(jù)鏈路層與物理層即設備與 設備驅(qū)動程序。圖1-2網(wǎng)際協(xié)議族2. TCP協(xié)議與TCP編程2.1 TCP協(xié)議略解TCP 是可靠的、可流量控制的、排序的、全雙工的網(wǎng)絡網(wǎng)際協(xié)議。 可靠性TCP 當往另一端發(fā)送數(shù)據(jù)時需要對端返回一個確認, 如果在一定時間沒有收 到確認, TCP 將會自動重傳數(shù)據(jù)并等待更長時間,直到數(shù)次重傳失敗之后、TCP才選擇放棄,一般為 410 分鐘。 流量可控TCP還有動態(tài)估算客戶端與服務器端往返時間(RTT, round-trip time ) 的算法,以便估算等待一個確認需要多長時間 排序TCP會對自己發(fā)出的每一個字節(jié)關(guān)聯(lián)一個序列號,
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國盆景行業(yè)發(fā)展趨勢規(guī)劃分析報告
- 柳州城市職業(yè)學院《城鄉(xiāng)規(guī)劃原理C》2023-2024學年第二學期期末試卷
- 山東體育學院《有機化學I2》2023-2024學年第二學期期末試卷
- 廣州城市理工學院《交換原理與NGN》2023-2024學年第二學期期末試卷
- 2025年海南省安全員考試題庫附答案
- 遼寧工程技術(shù)大學《領(lǐng)導科學》2023-2024學年第二學期期末試卷
- 山東商業(yè)職業(yè)技術(shù)學院《生物化學與分子生物學(含遺傳學)》2023-2024學年第二學期期末試卷
- 鄭州城市職業(yè)學院《英語高級視聽說》2023-2024學年第二學期期末試卷
- 德宏師范高等??茖W?!?0世紀西方文學》2023-2024學年第二學期期末試卷
- 湛江科技學院《土木工程施工技術(shù)》2023-2024學年第二學期期末試卷
- 中建10t龍門吊安拆安全專項施工方案
- 國內(nèi)外測井技術(shù)現(xiàn)狀與展望文檔
- 《銷售人員的培訓》課件
- 國防動員課件教學課件
- 特殊作業(yè)安全管理監(jiān)護人專項培訓課件
- 衛(wèi)生技術(shù)人員準入制度
- 自行車被盜案匯報課件
- 律師事務所案件管理手冊
- 《節(jié)水評價技術(shù)導則》
- 簡單酒店裝修合同書范本(30篇)
- 2024-2030年中國核桃油行業(yè)消費趨勢及競爭格局分析研究報告
評論
0/150
提交評論