linux網路程式設計之RTP協議

2021-09-05 15:49:15 字數 2208 閱讀 7589

以下內容取自:

本機通訊:

協議傳輸)

協議傳輸)

非本機:關於伺服器ip的傳輸方法)

其中的python檔案用於獲取到rtp協議的字段的值,vlc上的流設定:

根據獲取到的值來為c程式設計中模擬rtp協議頭:

80解析為1000 0000,也就是v:10(也就是值為2),p:0,x:0,cc:0。

第四列為遞增的,也就是sequence_number。

其中的rtp_header格式考慮到本機位元組序與網路位元組序問題每個位元組裡的位反過來宣告。注意unsigned short為16,unsigned int為32。

由於sequence需要滿足遞增的規律並且考慮到位元組序的問題,因此需要htons()和ntohs()。

要使用網域名稱訪問的話將其改為:

新增乙個標頭檔案,再定義乙個udp_ip為伺服器的ip位址,再將dest_addr.sin_sddr.s_addr=inaddr_any改為dest_addr.sin_addr.s_addr=inet_addr(udp_server_ip)即可。

但是我這裡的windows上的vlc訪問192.168.157.10:6666(我的虛擬機器的ip)會卡死,可能是流的問題?ping是能ping通的,不太清楚原因,以後再看。

這裡看一下sendto和recvfrom函式:

客戶端需要宣告要傳送資訊給到的伺服器端的ip,伺服器端則定義inaddr_any就好。客戶端和伺服器端需要宣告同樣的端口才好進行通訊。

//buf初始化:

bzero(buf,sizeof(buf));

//訊息傳送的主要操作:

len=recvfrom((int)sockfd,(void *)buf,sizeof(buffer),(unsigned int)flags,(struct sockaddr*)from,int *fromlen);//這裡的buf也就是傳回來的內容,可以直接print。注意最後乙個引數要取址。

sendto((int)sockfd,(const void*)buffer,sizeof(buffer),(unsigned int)flags,(const struct sockaddr*)to,int tolen);//這個函式用到const應該是避免傳輸過程中修改傳送端的資料。

//由使用者傳送訊息的一端需要有讀取字元裝置的操作:

len=read(stdin_fileno,buf,sizeof(buf));

//sockaddr和sockaddr_in的關係:

其實是一樣的可以互相轉化,所佔記憶體也是一樣大的,賦值的時候我們用到sockaddr_in,函式呼叫就用sockaddr。

&(sizeof(addr))這種操作是錯的,sizeof是關鍵字,並且是編譯時確定的量,執行函式時無法取址,因此先int addr_len=sizeof(struct addr),再在呼叫時使用&addr_len。

網路程式設計之UDP協議

將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...

網路程式設計之各種協議

在網路程式設計 時有各種協議,多的眼花繚亂,學著也容易混淆,特意整理一下,方便查閱 arp 位址解析協議,就是把ip位址和mac位址對應起來的,當網路中乙個ip位址沒有與之相對應的mac位址時,arp可以在網路中找到與之相對應的主機mac位址。ip在osi模型的網路層,mac在資料鏈路層,他倆彼此互...

網路程式設計之UDP協議

1 實現的功能 能夠傳送和接收訊息,並且在發生886後退出 2 chatroom 類 public class chatroom 3 傳送執行緒sendthread 類public class sendthread implements runnable override public void r...