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...