2017-06-01 66 views
0

我最近一直在學習Linux套接字編程,主要是從this site爲什麼socketpair()允許SOCK_DGRAM類型?

該網站說,使用域/類型組合PF_LOCAL/SOCK_DGRAM ...

提供本地主機內的數據報服務。請注意,此 服務是無連接,但可靠,可能的例外 如果內核緩衝區應該耗盡,數據包可能會丟失。

我的問題,那麼,爲什麼socketpair(int domain, int type, int protocol, int sv[2])讓這個組合,根據其手冊頁時...

的socketpair()調用創建 一位不願透露姓名對連接插座指定的域名,指定的類型...

這裏沒有矛盾嗎?

我認爲在PF_LOCALPF_INETSOCK_DGRAM暗示UDP,這是一種無連接協議,所以無法調和socketpair()的要求似乎的衝突來創建連接的套接字。

回答

1

數據報套接字具有「僞連接」。協議並沒有真正的連接,但你仍然可以撥打connect()。這將遠程地址和端口與套接字相關聯,然後它只接收來自該源的數據包,而不是所有數據包的目的地是該套接字綁定的地址/端口,並且您可以使用send()而不是sendto()發送回這個遠程地址。

一個可能使用的例子是TFTP協議。服務器最初在知名端口上偵聽傳入請求。一旦傳輸開始,使用不同的端口,並且發送方和接收方可以使用connect()將套接字與該對端口相關聯。然後,他們只需發送和接收新的套接字即可參與傳輸。

同樣,如果您使用socketpair()與數據報套接字,它會創建兩個套接字之間的僞連接。

+0

在數據報套接字上使用'connect()'還可以在該套接字上使用'recv()'和'send()',而不必使用'recvfrom()'和'sendto()'。 –

+0

@RemyLebeau我認爲你可以在未連接的套接字上使用'recv()',你只是不知道它來自哪裏。但是你對'send()'是正確的。 – Barmar

相關問題