簡體   English   中英

從一個TCP-Socket一次發送超過32768字節的數據

[英]Send more than 32768 Bytes at once from one TCP-Socket to an other

大家好,我不知道是否已經問過這個問題,但請想象以下情況:

我有兩個TCP套接字(使用NSSocketPort打開,並使用兩個NSFileHandle監聽),現在我想在它們之間發送一些NSData

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

一切正常,直到我要發送長度超過32768字節的NSData實例為止。 超過此字節數的字節將不會被傳輸。 所以這是我的問題:

1)為什么可可不能一次發送超過32768字節?
2)我必須采取解決方法嗎?
3)如果是,我將拆分數據,但是您將如何處理? 另一個套接字如何知道何時發送所有數據?

順便說一句,在發送此單個NSData實例后,應再次關閉兩個套接字。

您的問題不在於Cocoa,而似乎是對流套接字的概念性誤解。

TCP是流協議。 單獨寫入的邊界將不會保留。

如果發送32768字節,則接收端應做好准備,使readData(或任何它所謂的)返回從單個字節到32768字節的任何位置。 如果少於32768字節,則應再次閱讀以獲取其余部分。 也許不是所有其他內容,您都必須再次閱讀。 由您決定網絡協議,以便接收端知道何時獲取所有數據。 例如,通過為數據加上長度作為前綴。

如果writeData發送的數據少於您要求發送的數據,請再次使用其余數據調用writeData。 並為此做好准備以使發送的郵件數量少於您的要求。

一次發送的數據量取決於基礎框架和庫使用的緩沖區大小。 盡管它是可配置的,但基本上無關緊要。 TCP的優點是它可以保證以一個或多個數據包的形式傳遞數據,也可以正常地失敗。

  1. 您無需在發送前拆分數據。 底層系統將為您完成此任務。
  2. 在接收端,您可以讀取可用數據,然后等待直到更多字節到達,對其進行處理,依此類推,直到沒有更多數據可用為止。 發送方完成數據發送后,它將關閉套接字,接收方將收到通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM