關於使用UDP套接字進行本地程序通訊

2021-06-22 22:42:28 字數 1916 閱讀 1390

1、linux中程序間的通訊可以使用套接字的方式

2、套接字的方式即將套接字的目的地設為「127.0.0.1:port」。以發包的形式將資料傳輸到本地的某個程序

3、套接字的方式可以選擇udp也可以選擇tcp。udp是不可靠連線,包頭中只有源埠,目的埠,udp長度以及udp的校驗和。傳輸層協議的校驗和是需要對整個資料報進行校驗的,具體可以查閱udp協議和tcp協議頭部的解釋。

4、另外在<606頁圖23-3中,給出了接收快取的預設大小是41600位元組。那麼說明乙個問題:因為我們知道udp協議只是盡可能的將資料報傳送到目的地,沒有重傳機制。所以如果傳送程序的傳送速度太快,使得接收快取沒有能夠及時騰出新的空間給新到的資料報,就會導致丟失資料。如果是這樣的話,使用udp套接字似乎不能夠完成程序間的通訊。

5、不過,還是需要實驗證明:

實驗設計:使用udp套接字,本地的乙個傳送資料的程序將乙個檔案(srcfile)傳輸到本地的另乙個接收程序。接收程序收到資料之後將其寫入到另外乙個檔案(dstfile)中。比較這兩個檔案的大小

實驗環境:一台4核的筆記本,記憶體大小為8g。原始檔案(srcfile)的大小:4.18gb

實驗結果:dstfile的大小為:3.17gb。可見使用udp方式完成程序間通訊,有可能會導致資料的丟失。

實驗所用原始碼如下:(udp套接字編寫的一組簡單的收發資料的程序)

接收程序:

#include

#include

#include

#include

#include

#include

int port = 9870;

void main()

fclose(fd);

close(socket_ser);

return ;

傳送程序:

#include

#include

#include

#include

#include

#include

int port = 9870;

void main()

fclose(fd);

close(socket_cli);

return ;

}inaddr_any就是指定位址為0.0.0.0的位址,這個位址事實上表示不

確定位址,或「所有位址」、「任意位址」。 一般來說,在各個系統中均定義成為0值。

例如montivista linux中在/usr/include/netinet/in.h定義為:

/* address to accept any incoming messages. */

#define inaddr_any ((in_addr_t) 0x00000000)

一般情況下,如果你要建立

網路伺服器

應用程式,則你要通知

伺服器作業系統:請在某位址 ***.***.***.***上的某埠 yyyy上進行偵聽,並且把偵聽到的資料報傳送給我。這個過程,你是通過bind()

系統呼叫完成的。——也就是說,你的程式要繫結

伺服器的某位址,或者說:把伺服器的某位址上的某埠佔為已用。伺服器

作業系統可以給你這個指定的位址,也可以不給你。

如果你的

伺服器有多個

網絡卡(每個網絡卡上有不同的ip位址),而你的服務(不管是在udp埠上偵聽,還是在tcp埠上偵聽),出於某種原因:可能是你的

伺服器作業系統可能隨時增減ip位址,也有可能是為了省去

確定伺服器上有什麼

網路埠(

網絡卡)的麻煩 —— 可以要在呼叫

bind()的時候,告訴作業系統:「我需要在 yyyy 埠上偵聽,所有傳送到

伺服器的這個埠,不管是哪個網絡卡/哪個ip位址接收到的資料,都是我處理的。」這時候,

伺服器程式則在0.0.0.0這個位址上進行偵聽。

關於udp套接字

setsockopt so reuseaddr 同一終端先後兩次執行udp server,該選項無影響。兩個 或多個 終端同時執行udp server,配置該選項時,僅第乙個終端執行成功 不配置時,所有終端均可成功執行udp server。udp客戶端呼叫connect 實現 不發起三次握手 僅將服...

udp套接字的使用

傳送與接收資料 import socket defmain 建立乙個udp套接字 udp socket socket.socketip 可以使用套接字收發資料 upd socket.sendto hahahah 對方的ip以及port udp socket.sendto b hahaha 192.1...

5 使用套接字進行讀寫

傳送資料 write send 和 sendmsg。ssize t write int socketfd,const void buffer,size t size ssize t send int socketfd,const void buffer,size t size,int flags s...