2012-09-12 76 views
1

我需要開發一個能夠接收週期性緊急超越界數據的TCP服務器。我正在使用POCO C++庫來實現這一點。在StreamSocket類的(稀缺)的文檔,我看這應該是一個很容易的任務來實現:它應該使用receiveBytes時設置SO_OOBINLINE標誌(完成)方法,像這樣:使用POCO C++通過TCP連接發送和接收OOB數據

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE); 

爲了測試這一點,我做,它使用「sendUrgent()」方法來發送所述OOB數據一個非常簡單的TCP客戶端(也用POCO庫)(一個字節):

ss1.sendUrgent(0xFF); 

當我發送OOB數據,沒有任何反應。服務器似乎沒有注意到它。另一方面,當我發送「普通」數據時,使用sendBytes()方法,如果SO_OOBINLINE標誌在StreamSocket上設置,我會收到無限量的相同的發送數據(它會一直讀取相同的數據數據雖然沒有人重發它)。

我錯過了什麼?

編輯:@ JimR的建議和閱讀this後,我曾嘗試:

n = ss.receiveBytes(buffer, sizeof(buffer), MSG_OOB); 

即使這樣:

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE | MSG_OOB); 

都提出同樣的異常:無效的參數。

+0

'SO_OOBINLINE'告訴套接字在常規讀取中返回OOB數據。 –

回答

1

認爲(這是一個很長的時間),你應該改變

n = ss.receiveBytes(buffer, sizeof(buffer), SO_OOBINLINE);

n = ss.receiveBytes(buffer, sizeof(buffer), MSG_OOB);

編輯:隨着上述變化,你將需要調用setsockoptSO_OOBINLINE標誌和適當的參數,所以OOB數據將在正常流中看到,而不是在單獨的通道中看到。如您的意見所述,請致電ss.setOOBInline(true);

SO_OOBINLINE是與setsockopt一起使用的插座選項。

MSG_OOBrecvsend和公司的標誌。

+0

感謝您的回答。如果我進行此更改,_receiveBytes_方法將拋出一個異常:「無效參數」。 _sendUrgent_方法的文檔說明如下: 「通過套接字發送一個字節的緊急數據 數據與MSG_OOB標誌一起發送 套接字接收緊急數據的首選方法是啓用SO_OOBINLINE選項」。 – pparescasellas

+0

@pparescasellas:同意'SO_OOBINLINE'是首選,但是...除非POCO正在改變它的含義,否則Linux源代碼中唯一提及的'SO_OOBINLINE'與調用'setsockopt'和公司及其定義有關。你可以在這裏看到:http://www.kneuro.net/cgi-bin/lxr/http/ident?a = sparc64; i = SO_OOBINLINE – JimR

+0

@pparescasellas:剛纔發生了一些事情,我想我會提到它。在使用MSG_OOB之前是否使用setsockopt將'SO_OOB_INLINE'選項添加到套接字?如果沒有,那可能是你爲什麼會得到例外...... – JimR

相關問題