1. 程式人生 > >基於 Socket 的 UDP 和 TCP 程式設計介紹

基於 Socket 的 UDP 和 TCP 程式設計介紹

一、概述

TCP(傳輸控制協議)和UDP(使用者資料報協議是網路體系結構TCP/IP模型中傳輸層一層中的兩個不同的通訊協議。

TCP:傳輸控制協議,一種面向連線的協議,給使用者程序提供可靠的全雙工的位元組流,TCP套介面是位元組流套介面(stream socket)的一種。

UDP:使用者資料報協議。UDP是一種無連線協議。UDP套介面是資料報套介面(datagram socket)的一種。

二、TCP和UDP介紹

1)基本TCP客戶—伺服器程式設計基本框架

column179-1

說明:(三路握手)

1.客戶端傳送一個SYN段(同步序號)指明客戶打算連線的伺服器埠,以及初始化序號(ISN) 。

2.伺服器發回包含伺服器的初始序號的SYN報文段作為應答。同時,將確認序號(ACK)設定為客戶的ISN加1以對客戶的SYN 報文段進行確認。一個SYN將佔用一個序號。

3.客戶必須將確認序號設定為伺服器的ISN加1以對伺服器的SYN報文段進行確認。

column179-2

2) 基本TCP客戶—伺服器程式設計基本框架流程圖

column179-3

3) UDP和TCP的對比:
從上面的流程圖比較我們可以很明顯的看出UDP沒有三次握手過程。簡單點說。UDP處理的細節比TCP少。UDP不能保證訊息被傳送到(它也報告訊息沒有傳送到)目的地。UDP也不保證資料包的傳送順序。UDP把資料發出去後只能希望它能夠抵達目的地。

TCP優缺點:
優點:
1.TCP提供以認可的方式顯式地建立和終止連線。
2.TCP保證可靠的、順序的(資料包以傳送的順序接收)以及不會重複的資料傳輸。
3.TCP處理流控制。
4.允許資料優先
5.如果資料沒有傳送到,則TCP套介面返回一個出錯狀態條件。
6.TCP通過保持連續並將資料塊分成更小的分片來處理大資料塊。—無需程式設計師知道

缺點: TCP在轉移資料時必須建立(並保持)一個連線。這個連線給通訊程序增加了開銷,讓它比UDP速度要慢。

UDP優缺點:
1.UDP不要求保持一個連線
2.UDP沒有因接收方認可收到資料包(或者當資料包沒有正確抵達而自動重傳)而帶來的開銷。
3.設計UDP的目的是用於短應用和控制訊息
4.在一個數據包連線一個數據包的基礎上,UDP要求的網路頻寬比TDP更小。

三、Socket程式設計

Socket介面是TCP/IP網路的API,Socket介面定義了許多函式或例程,程式設計師可以用它們來開發TCP/IP網路上的應用程式。要學Internet上的TCP/IP網路程式設計,必須理解Socket介面。

Socket介面設計者最先是將介面放在Unix作業系統裡面的。如果瞭解Unix系統的輸入和輸出的話,就很容易瞭解Socket了。網路的Socket資料傳輸是一種特殊的I/O,Socket也是一種檔案描述符。Socket也具有一個類似於開啟檔案的函式呼叫Socket(),該函式返回一個整型的Socket描述符,隨後的連線建立、資料傳輸等操作都是通過該Socket實現的。

常用的Socket型別有兩種:流式Socket(SOCK_STREAM)和資料報式Socket(SOCK_DGRAM)。流式是一種面向連線的Socket,針對於面向連線的TCP服務應用;資料報式Socket是一種無連線的Socket,對應於無連線的UDP服務應用。

1、socket呼叫庫函式主要有:
建立套接字
Socket(af,type,protocol)
建立地址和套接字的聯絡
bind(sockid, local addr, addrlen)
伺服器端偵聽客戶端的請求
listen( Sockid ,quenlen)
建立伺服器/客戶端的連線 (面向連線TCP)
客戶端請求連線
Connect(sockid, destaddr, addrlen)
伺服器端等待從編號為Sockid的Socket上接收客戶連線請求
newsockid=accept(Sockid,Clientaddr, paddrlen)
傳送/接收資料
面向連線:send(sockid, buff, bufflen)
recv( )
面向無連線:sendto(sockid,buff,…,addrlen)
recvfrom( )
釋放套接字
close(sockid)

2、TCP/IP應用程式設計介面(API)
伺服器的工作流程:首先呼叫socket函式建立一個Socket,然後呼叫bind函式將其與本機地址以及一個本地埠號繫結,然後呼叫listen在相應的socket上監聽,當accpet接收到一個連線服務請求時,將生成一個新的socket。伺服器顯示該客戶機的IP地址,並通過新的socket向客戶端傳送字串” hi,I am server!”。最後關閉該socket。

C
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 main(){intsock_fd,client_fd;/*sock_fd:監聽socket;client_fd:資料傳輸socket */structsockaddr_in ser_addr;/* 本機地址資訊 */structsockaddr_in cli_addr;/* 客戶端地址資訊 */charmsg[MAX_MSG_SIZE];/* 緩衝區*/ser_sockfd=socket(AF_INET,SOCK_STREAM,0);/*建立連線的SOCKET */if(ser_sockfd<0){/*建立失敗 */fprintf(stderr,"socker Error:%sn",strerror(errno));exit(1);}/* 初始化伺服器地址*/addrlen=sizeof(structsockaddr_in);bzero(&ser_addr,addrlen);ser_addr.sin_family=AF_INET;ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);ser_addr.sin_port=htons(SERVER_PORT);if(bind(ser_sockfd,(structsockaddr*)&ser_addr,sizeof(structsockaddr_in))<0){/*繫結失敗 */fprintf(stderr,"Bind Error:%sn",strerror(errno));exit(1);}/*偵聽客戶端請求*/if(listen(ser_sockfd,BACKLOG)<0){fprintf(stderr,"Listen Error:%sn",strerror(errno));close(ser_sockfd);exit(1);}while(1){/* 等待接收客戶連線請求*/cli_sockfd=accept(ser_sockfd,(structsockaddr*)&cli_addr,&addrlen);if(cli_sockfd<=0){fprintf(stderr,"Accept Error:%sn",strerror(errno));}else{/*開始服務*/recv(cli_addr,msg,MAX_MSG_SIZE,0);/* 接受資料*/printf("received a connection from %sn",inet_ntoa(cli_addr.sin_addr));printf("%sn",msg);/*在螢幕上打印出來 */strcpy(msg,"hi,I am server!");send(cli_addr,msg,sizeof(msg),0);/*傳送的資料*/close(cli_addr);}}close(ser_sockfd);}

客戶端的工作流程:首先呼叫socket函式建立一個Socket,然後呼叫bind函式將其與本機地址以及一個本地埠號繫結,請求連線伺服器,通過新的socket向客戶端傳送字串” hi,I am client!”。最後關閉該socket。

C
12345678910111213141516171819202122232425262728293031323334353637383940414243444546 main(){intcli_sockfd;/*客戶端SOCKET */intaddrlen;charseraddr[14];structsockaddr_in ser_addr,/* 伺服器的地址*/cli_addr;/* 客戶端的地址*/charmsg[MAX_MSG_SIZE];/* 緩衝區*/GetServerAddr(seraddr);cli_sockfd=socket(AF_INET,SOCK_STREAM,0);/*建立連線的SOCKET */if(ser_sockfd<0){/*建立失敗 */fprintf(stderr,"socker Error:%sn",strerror(errno));exit(1);}/* 初始化客戶端地址*/addrlen=sizeof(structsockaddr_in);bzero(&ser_addr,addrlen);cli_addr.sin_family=AF_INET;cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);cli_addr.sin_port=0;if(bind(cli_sockfd,(structsockaddr*)&cli_addr,addrlen)<0){/*棒定失敗 */fprintf(stderr,"Bind Error:%sn",strerror(errno));exit(1);}/* 初始化伺服器地址*/addrlen=sizeof(structsockaddr_in);bzero(&ser_addr,addrlen);ser_addr.sin_family=AF_INET;ser_addr.sin_addr.s_addr=inet_addr(seraddr);ser_addr.sin_port=htons(SERVER_PORT);if(connect(cli_sockfd,(structsockaddr*)&ser_addr,&addrlen)!=0)/*請求連線*/{/*連線失敗 */fprintf(stderr,"Connect Error:%sn",strerror(errno));close(cli_sockfd);exit(1);}strcpy(msg,"hi,I am client!");send(sockfd,msg,sizeof(msg),0);/*傳送資料*/recv(sockfd,msg,MAX_MSG_SIZE,0);/* 接受資料*/printf("%sn",msg);/*在螢幕上打印出來 */close(cli_sockfd);}

伺服器的工作流程:首先呼叫socket函式建立一個Socket,然後呼叫bind函式將其與本機地址以及一個本地埠號繫結,接收到一個客戶端時,伺服器顯示該客戶端的IP地址,並將字串返回給客戶端。

3、UDP/IP應用程式設計介面(API)

C
12345678910111213141516171819202122232425262728293031323334353637383940 intmain(intargc,char**argv){intser_sockfd;intlen;/* int addrlen; */socklen_t addrlen;charseraddr[100];structsockaddr_in ser_addr;/*建立socket*/ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);if(ser_sockfd<0){printf("I cannot socket successn");return(1);}/*填寫sockaddr_in 結構*/addrlen=sizeof(structsockaddr_in);bzero(&ser_addr,addrlen);ser_addr.sin_family=AF_INET;ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);ser_addr.sin_port=htons(SERVER_PORT);/*繫結客戶端 * if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0) * { * printf("connect"); * return 1; * } * while(1) * { * bzero(seraddr,sizeof(seraddr)); * len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&ser_addr,&addrlen); * /*顯示client端的網路地址*/printf("receive from %sn",inet_ntoa(ser_addr.sin_addr));/*顯示客戶端發來的字串*/printf("recevce:%s",seraddr);/*將字串返回給client端*/sendto(ser_sockfd,seraddr,len,0,(structsockaddr*)&ser_addr,addrlen);}

客戶端的工作流程:首先呼叫socket函式建立一個Socket,填寫伺服器地址及埠號,從標準輸入裝置中取得字串,將字串傳送給伺服器端,並接收伺服器端返回的字串。最後關閉該socket。

相關推薦

基於 SocketUDP TCP 程式設計介紹

一、概述 TCP(傳輸控制協議)和UDP(使用者資料報協議是網路體系結構TCP/IP模型中傳輸層一層中的兩個不同的通訊協議。 TCP:傳輸控制協議,一種面向連線的協議,給使用者程序提供可靠的全雙工的位元組流,TCP套介面是位元組流套介面(stream socket)

基於SocketUDPTCP程式設計介紹

main(){     int sock_fd,client_fd; /*sock_fd:監聽socket;client_fd:資料傳輸socket */     struct sockaddr_in ser_addr; /* 本機地址資訊 */     struct sockaddr_in cli_a

UDPTCP介紹

1、TCP與UDP區別總結: 1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線 2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付 Tcp通過校驗和,重

基於socket簡單的TCP下載傳輸

客戶端: import socket def main(): tcp_custom=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sev_ip=input('shu ru ip:') sev_port=input('shu ru

RTSP請求詳解及RTP 基於UDPTCP協議傳輸資料的對比

最近一段時間一直在研究rtsp和rtp,現在寫部落格總結一下,也是對知識的一種鞏固吧。 下面是我用VLC播放器獲取海康NVR視訊的截圖(此次獲取是基於TCP的): 下面來看一下針對每一條訊息的詳細截圖: 客戶端傳送的OPTION訊息: 伺服器對OPTION回覆的200

網路程式設計與多執行緒的應用--基於socket udp編寫一個簡單聊天程式

void CChatDlg::OnBnClickedButtonSend() {// TODO: Add your control notification handler code here//獲取對方IPCIPAddressCtrl* pIPAddress = ((CIPAddressCtrl*)GetD

記一次基於LR的UDPTCP效能測試

背景   最近專案要做效能測試,要出要一份效能報告,讓我出一個有關Tcp和Udp的功能模組的測試,流程大概是這樣,先走TCP協議協商一下會話,協商成功後走Udp收發資料。      有點簡單啊,自己寫個功能模組測一下,然後把結果展示出來就ok了。   然而想法很美好,現實有點殘酷。idea瞬間被pas

DNS分別在什麽情況下使用UDPTCP

分享 pos 發現 主域名 全部 prim data font tex DNS同一時候占用UDP和TCPport53是公認的,這樣的單個應用協議同一時候使用兩種傳輸協議的情況在TCP/IP棧也算是個另類。但非常少有人知道DNS分別在什麽情況下使用這

【iOS與EV3混合機器人編程系列之四】iOS_WiFi_EV3_Library 剖析之中的一個:WiFi UDPTCP

microsoft bsp lte lib async stop contex pop 分析 在上一篇文章中。我們通過編寫EV3 Port Viewer項目實現了iOS監測EV3的實時端口數據。程序最核心的部分就是我們的開源碼庫iOS_WiFi_EV3_Library。

UDPTCP的差異

ima 數據 而且 傳遞數據 通訊 情況下 bubuko 訪問 分享圖片 UDP和TCP傳遞數據的差異類似於電話和明信片之間的差異。  TCP就像電話,必須先驗證目標是否可以訪問後才開始通訊。  UDP就像明信片,信息量很小而且每次傳遞成功的可能性很高,但是不能完全保證傳遞

UDP TCP特點理解

報文 發展 數據 運輸層協議 目的 努力 什麽 大於 檢驗 UDP TCP 1 無連接的運輸層協議 面向連接的運輸層協議 2 支持一對一、一對多、多對一的交互通信 每條TCP連接只有點對點的即一對一通信 3 盡

java的UDPTCP詳解北京-賽車平臺出租源碼分析

ati 消息 byte ide 一段 pack catch 打包 println 1、需求分析北京-賽車平臺出租Q1446595067 最近在和硬件做網口的傳輸協議,一開始告訴我說用TCP的socket進行傳輸,我說沒問題,就寫了個socket的發送和接收方法。but過了沒

socket APITCP/IP協議學習

socket API和TCP/IP協議學習 本部落格用於記錄socket API和TCP/IP協議的學習 目標在2017.1.1之前看完unix網路程式設計卷一和TCP/IP詳解卷一 本部落格的環境是opensuse Tumbleweed,其他linux發行版

(3)傳輸層UDPTCP協議

傳輸層UDP和TCP協議 簡介 兩個主機進行通訊實際上就是兩個主機中的應用程序互相通訊。 應用程序之間的通訊又稱為端到端的通訊。 網路層是為主機之間提供邏輯通訊,而傳輸層為應用程序之間提供端到端的邏輯通訊。傳輸層還要對收到的報文進行差錯檢測。 傳輸層需要有兩種不同的傳輸協

Spring中基於AspectJ的AOP切面程式設計介紹及實現

簡介: AOP Aspect Oriented Programing 面向切面程式設計 AOP採取==橫向抽取==機制,取代了傳統==縱向繼承==體系重複性程式碼(效能監視、事務管理、安全檢查、快取) Spring中的Aop是純Java來實現的,使用==動態代理==的方式增強程

第五章 運輸層(UDPTCP三次握手,四次揮手分析)

    序言         通過這章,可以知道其實三次握手和四次揮手其實真的好簡單,通過這章的學習,我相信你也會同樣的認為,以後在也不需要聽到別人問三次握手的過程而自己一臉懵逼了,覺得人家好屌,其實也就是他懂你不懂,僅此而已,不懂就去學。學了你就會覺得其實也就那樣,沒有什麼厲害的,這讓我回想以前剛學習程式設

Android程式設計師必知必會的網路通訊傳輸層協議——UDPTCP

1、點評 網際網路發展至今已經高度發達,而對於網際網路應用(尤其即時通訊技術這一塊)的開發者來說,網路程式設計是基礎中的基礎,只有更好地理解相關基礎知識,對於應用層的開發才能做到遊刃有餘。 對於Android程式設計師來說,如果您覺得本文內容稍顯枯燥,可以看看即時通訊網之前整理過的一篇類似文

網路傳輸協議(UDPTCP的一些理解)

網路通訊 UDP 1.1 網路通訊的概念 兩臺機器進行通訊 1.2 ip地址 1.1 什麼是地址 飛秋通訊能夠準確的給想要的人傳送訊息每個人都有一個唯一的ip地址 ip地址:目的用來標記網路上的一臺電腦 1.2 ip地址的作用

UDPTCP 面試問題重點

一、UDP(使用者資料報協議)其特點: (1)UDP是無連線 (2)UDP使用盡最大努力交付,即不保證可靠性 (3)UDP是面向報文的 (4)UDP 沒有擁塞控制,所以即使網路出現擁塞,也不會使源主機的傳送速率降低。 (5)UDP 支援一對一、一對多、多對一、多對多的互動通

用vlc搭建簡單流媒體伺服器(UDPTCP方式)

這段時間用到了流媒體資料傳輸的TCP和UDP方式,感覺vlc可以做這方面的demo,這裡總結下,也方便我以後查閱。 簡介 VLC不僅僅是個播放器,也可以作為流媒體伺服器使用。這個網上有相關的資料,我就不多說了。 宣告下本文用的VLC版本:2.0.3 用VLC搭建基於UDP的流媒體伺服器 流媒體伺服器大