顯示具有 [程式設計]網路程式 標籤的文章。 顯示所有文章
顯示具有 [程式設計]網路程式 標籤的文章。 顯示所有文章

2025年3月27日 星期四

p2p on TCP

使用 C 语言 实现 P2P 通信,并且不希望使用 TURN(例如因性能问题或不想依赖外部服务器),而且希望能够通过 TCP 实现更高效的 NAT 穿越,以下是一些符合这些条件的库和解决方案。

1. PJSIP (使用 STUN 但不依赖 TURN)

虽然你提到不希望使用 TURN,但 PJSIP 是一个非常强大的 SIP 协议栈,支持 TCPUDP,并且可以通过 STUN 实现基本的 NAT 穿越。如果不依赖 TURN,而是仅仅使用 STUN 来帮助设备发现公共地址,应该能达到较高的效率。

2023年9月3日 星期日

[Protocol] HTTP header

  • Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」,用来改变报文格式,它不但不会减少实体内容传输大小,甚至还会使传输变大。
    • 使用分塊傳輸編碼(Transfer-Encoding),數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。
    • 在消息頭中指定 Transfer-Encoding: chunked 就表示整個response將使用分塊傳輸編碼來傳輸內容,一個完整的消息體由n個塊組成,並以最後一個大小為0的塊為結束。每個非空的塊包括兩部分,分別為:塊的長度(用十六進制表示)後面跟一個CRLF (回車及換行),長度並不包括結尾的回車換行符。第二部分就是數據本身,同樣以CRLF (回車及換行)結束。最後一塊是單行,只由塊大小(0)以及CRLF組成,不包含任何數據。

2023年3月15日 星期三

hub switch IP分享器 router的差別

hub


hub中文翻譯為集線器,一般而言,HUB有兩大特性,一個就是廣播,一個就是半雙工。hub比較單純,收到資料以後,把資料送出去給底下的所有線路,再看對方要不要接收這個資料,這是hub的運作原理。 半雙工是指,收資料或送資料不能同時,你一次只能做其中一種。由於HUB的這種特性,所以當HUB連接非常多電腦時,網路就會變慢。

switch


switch中文翻譯為交換器,是以全雙工的方式傳送資料。使用switch就比較複雜了,資料收到了以後,switch會去查Mac address,也就是一張網路卡獨一無二的識別碼,再把資料送到指定的主機,就不會每台主機都送,然後那一台主機把資料收進來,其他電腦並不會也收到資料,而且這個時候別的電腦也可以同時互相傳送資料,這是switch的運作原理。

2023年1月2日 星期一

Redis 筆記

Redis

How to

  • 啟動 Redis 資料庫服務 sudo systemctl start redis.service

2022年5月2日 星期一

HTTP傳輸大檔案原理

有三種方法可以縮短通過 HTTP 發送大量資料的時間:

  • 壓縮資料
  • 發送區塊資料
  • 請求選定範圍內的資料


以上三種方法可以組合起來一起使用。在 HTTP 1.1 版引入了區塊資料來幫助處理大量資料情況。

2022年4月12日 星期二

[轉]TCP、UDP傳送資料的大小限制,UDP一次傳送多大資料為好

 1、概述

首先要看TCP/IP協議,涉及到四層:鏈路層,網路層,傳輸層,應用層。   

其中乙太網(Ethernet)的資料幀在鏈路層   

IP包在網路層   

TCP或UDP包在傳輸層   

TCP或UDP中的資料(Data)在應用層   

它們的關係是 資料幀{IP包{TCP或UDP包{Data}}}   

2022年3月18日 星期五

Gstreamer, glib debug note

GST_DEBUG=rtspauth,rtspclient:6 ./gstreamer_app

G_MESSAGES_DEBUG=all ./bin/pptPC GLib-GIO-DEBUG

setenv("G_DEBUG", "all", TRUE);

setenv("G_MESSAGES_DEBUG", "all", TRUE);

RTSP/RTP/RTCP封包基本工作過程分析

整體而言,RTSP 通常工作於可靠的傳輸協議 TCP 之上,就像 HTTP 那樣,用於發起/結束流媒體傳輸,交換流媒體元資訊。RTP 通常工作於 UDP 之上,用於傳輸實際的流媒體資料,其中的載荷格式因具體流媒體型別的不同而不同,通常有專門的 RFC 規範對其進行定義,如 H.264 編碼格式視訊資料的載荷格式在 RFC 6184, RTP Payload Format for H.264 Video 中定義,其它流媒體資料型別有其它的規範進行定義。RTCP 同樣通常工作於 UDP 之上,用於對 RTP 進行控制,流媒體資料的收發端在傳輸過程中相互發送 RTCP 資料包,將自己這一端檢測到的 QoS 等資訊傳遞給對方,使用 RTP/RTCP 協議的應用程式,利用這些資訊對收發過程進行控制。RTP 和 RTCP 在傳輸過程中,工作於不同的埠上。

2022年3月17日 星期四

503 Service Unavailable Error 是什麼?如何修復它?

503 Service Unavailable Error 表示服務器暫時無法處理請求,但在其他方面正常運行。通常是由於服務器因計劃維護而“停機”,或者由於流量負載過大而無法正確處理所有傳入請求,還有一個就是防火牆配置不當。

2021年10月28日 星期四

UNIX網絡編程——ioctl 函數的用法詳解

 1.介紹

       Linux網絡程序與內核交互的方法是通過ioctl來實現的,ioctl與網絡協議棧進行交互,可得到網絡接口的信息,網卡設備的映射屬性和配置網絡接口。並且還能夠查看,修改,刪除ARP高速緩存的信息,所以,我們有必要了解一下ioctl函數的具體實現。

 

2021年10月19日 星期二

UDP 掉封包的原因及處理

表示收的速度不夠快, 相對來說就是 "送" 的速度太快

可以考慮兩個方式

  • 在每個 send 中間加上 delay, 不要讓他送太快, delay 多久自己評估
  • 將連續送的方式改為一送一收的方式, 變相的同步

2021年8月16日 星期一

Gstreamer详细指南 HOW TO DEBUG

 Gstreamer 提供的各种工具


这篇文章主要介绍Gstreamer提供的各种工具和LOG系统。

对于Gstreamer提供的各种工具,将按照linux man page的方式进行书写。

gst-launch 命令
gst-launch - 创建和运行一条pipeline

Synopsis
gst-launch  [OPTION...] PIPELINE-DESCRIPTION

2021年8月5日 星期四

GStreamer 安裝與使用

Gstreamer 是開放原始碼多媒體開發框架. 先參考 GStreamer 基礎文件, 瞭解模組 (Plugins), 元件 (Element) 與接點 (Pads - source 與 sink).


本文簡單說明 Gstreamer 在 Jetson TK1 R21.2 Ubuntu 14.04 環境下安裝與 gst-* 工具使用.


<< 安裝 GStreamer >>

2021年6月18日 星期五

【SOCKET】Listen函式

Definition

用來通知OS/network socketfd的socket已經可以接受建立連線。Listen()並未開始接收連線,只是設置socket為listen模式,真正接收client端連線的是accept()。通常listen()會在socket(),bind()之後調用,接着才調用accept()。listen()並不會block住等待client的request。

#include <sys/socket.h>

Prototype

int listen(int socketfd, int backlog);

Arguments

  • sockfd - socket的描述符
  • backlog - 同時能處理的最大連接要求,如果連接數目達此上限則client端將收到ECONNREFUSED的錯誤,listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog最大值可設至128。

2021年6月17日 星期四

【SOCKET】bind函式

Definition

將地址綁在Socket身上。在伺服器設定中使用這個函式,可以限制連進來的IP和port;在客戶端設定中使用這個函式,可以限制連出去所使用的IP和port。

Prototype

int bind(int sockfd, struct sockaddr* addr, int addrlen);

Arguments

  • sockfd - socket的描述符
  • addr - 與connetc()的 server 的設定大同小異,值得一提的是s_addr,這部分常有人設定為info.sin_addr.s_addr = INADDR_ANY,INADDR_ANY表示我不在乎loacl IP是什麼,讓kernel替我決定就好。
  • addrlen - 即是 *addr的大小

2021年5月6日 星期四

port 0的用途是什麼?

端口0在網絡編程中具有特殊的意義,特別是在Unix OS中,在套接字編程中,該端口用於請求系統分配的動態端口。端口0是通配符端口,它告訴系統找到合適的端口號。


與大多數端口號不同,端口0是TCP / IP網絡中的保留端口,這意味著它不應在TCP或UDP消息中使用。 TCP和UDP中的網絡端口的範圍是從零到65535。介於零和1023之間的端口號定義為非臨時端口,系統端口或眾所周知的端口。 Internet號碼分配機構(IANA)維護了這些端口號在Internet上的預期用途的正式列表,並且不使用系統端口0。


網絡編程中TCP / UDP端口0的工作方式

2021年4月28日 星期三

SOCKET函式

send/sendto和recv/recvfrom各自的區別

一般情況下:

   send(),recv()用於TCP,sendto()及recvfrom()用於UDP

   但是send(),recv()也可以用於UDP,sendto()及recvfrom()也可以用於TCP

   sendto可以在引數中指定傳送的目標地址 , send需要socket已建立連線, sendto 可用於無連線的 socket 對於send的有連線socket,兩者一樣,sendto最後兩個引數沒用.

2021年3月15日 星期一

啟用Apache的SSL(Ubuntu)

啟用Apache的https步驟:

1.安裝apache (這是假設沒有安裝或版本比較舊)

這個步驟必須要連結網路才行


sudo apt-get install apache2

 

2.啟用SSL模組

sudo a2enmod ssl

2021年3月9日 星期二

TCP穿透NAT範例 in C

 1. TCP穿透原理:

    我們假設在兩個不同的前面後面分別有2個台站A和B,AB位於的初始化都分別通過一個路由器接入互聯網。互聯網上一個台服務器S。

    現在AB是無法直接和對方發送信息的,AB都不知道對方在互聯網上真正的IP和端口,AB所在的轉換器的路由器僅允許內部並行主動發送的信息通過。對於B直接發送給A的路由器的消息,路由會認為其“不被信任”而直接替換。

    要實現AB直接的通訊,就必須進行以下3步:首先連接互聯網上的服務器S並發送一條消息(對於UDP這種無連接的協議實際上直接初始化會話發送消息即可),這樣S就獲取了然後B也進行同樣的步驟,S就知道了AB在互聯網上的終端(這就是“打洞”)。接下來分別告訴A和B對方客戶端在互聯網上的實際終端,也即S告訴A客戶B的會話終端,S告訴B客戶A的會話終端。這樣,在AB都知道了對方的實際終端之後,就可以直接通過實際終端發送消息了(因為先前雙方都延伸發送過消息,路由上已經有允許數據進出的消息通道)。