2012-08-09 64 views
0

這裏的任何機構可以告訴我如何發送大於提供給UDP套接字的系統緩衝區的數據報,以測試MSG_TRANC中的MSG_TRANC,以及如何獲取套接字緩衝區的大小?如何發送大於系統緩衝區的UDP數據報?

+0

您不能發送大於套接字緩衝區的UDP數據包。 (內核沒有空間,send()會與EMSGSIZE發生錯誤)你不能接收大於套接字緩衝區的數據報。 (內核沒有空間,並會丟棄數據包)。 – nos 2012-08-09 10:39:31

+0

但有一個標誌告訴你消息被截斷了 – ibatta 2012-08-10 11:20:12

+0

是的。也就是說,如果您嘗試在應用程序的_your_緩衝區中讀取數據包,但_your_緩衝區不夠大。例如某人向您發送了一個1000字節的數據包,並且您向recvmsg()發送了一個大小爲500的緩衝區,MSG_TRUNC標誌將被設置,前500個字節被複制到您的緩衝區,另外500個字節被丟棄。這裏有很多層次的工作。網卡 - >驅動程序環形緩衝區 - >內核套接字緩衝區 - >您的應用程序 – nos 2012-08-10 11:33:00

回答

0

使用SO_SNDBUF標誌,您可以始終使用setsockopt函數增加緩衝區大小。

否則send(或sendto)將正常阻塞。

但是,我建議您嘗試重寫協議,以便數據包能夠放入發送緩衝區。您可以隨時在收到包裝後重新組裝包裝(如果您有正確的順序)。

+0

好的。我會嘗試setsockopt爲SO_RCVBUF – ibatta 2012-08-09 10:45:47

+0

UDP'send(2)'不會阻止大於'SO_SNDBUF'的消息,它會通過'EMSGSIZE'出錯。 – 2012-08-09 15:19:29

+0

是的,這是正確的:) – ibatta 2012-08-10 11:04:53

0

你是什麼意思或想做什麼?
我希望你讀http://en.wikipedia.org/wiki/User_Datagram_Protocol

你是否試圖發送總長度大於單個數據包大小的數據報?或者你的發送緩衝區用於構建一個太小的數據包?

+0

我想測試MSG_TRUNC assosiated與UDP套接字,所以我必須增加發送端的緩衝區大小,所以MSG_TRUNC標誌工作 – ibatta 2012-08-09 10:45:13

相關問題