2010-10-29 56 views
3

我真的很想使用NSInputStream的getBuffer:length:方法。 經過大量研究,我找不到使用此方法的有效示例,因爲大多數人確實需要read: maxLength:NSInputStream getBuffer:長度:不起作用?

所以現在對周圍的一些事實: *我爲iPhone開發應用程序,iOS版3.1.3 *我已經建立了通過套接字 *該網絡連接實際工作網絡通信;所以我沒有忘記添加一個流到runloop或一個有效的委託或這樣的事情 - 它已經工作 *我只在網絡上發送和接收字符串。 *我設置了一個有效的代表,正確實施stream: handleEvent:(區分收到的事件並採取適當的措施)。 我不確定接收代碼是否100%正確,因爲我有時會收到兩次消息。 這也可能是由於我與之通信的設備上存在錯誤的實現。 爲了弄清楚哪一點是最後一點,我試圖找出有多少字節真的在接收緩衝區,當我收到「NSStreamEventHasBytesAvailable」事件。 由於我不確定我的實現是否正確,但我想知道實際收到的字節數,所以我想使用getBuffer: length:並查看後面的長度。 奇怪的是:長度永遠不會打印在控制檯上,因爲 [((NSInputStream *) stream) getBuffer: &buf length: &numBytes]總是計算爲FALSE。 無論如何,這部分代碼事後工作正常,在緩衝區中接收消息並正確轉發 - 效果很好。 問題依然存在:爲什麼getBuffer: length:沒有工作? 感興趣的代碼是在這裏:

` 情況下NSStreamEventHasBytesAvailable:{

 uint8_t *buf; 
     unsigned int numBytes; 

     if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) { 
      NSLog(@"\t\tBytes in the buffer: %i", &numBytes); 
     } 

     uint8_t buffer[BUFFER_SIZE]; 
     int len = [((NSInputStream *) stream) read: buffer 
             maxLength: BUFFER_SIZE]; 
     NSLog(@"\tread: %i bytes", len); 

     /* 
     if len > 0: len is equal to the filled byte elements 
     if len == 0: end of buffer was reached while reading 
     if len < 0: something terrible happened... 
     */ 
     if (len > 0) { 
      /* 1. create string from received byte buffer */ 
      NSString *msg = [[NSString alloc] initWithBytes: buffer length: len encoding: NSASCIIStringEncoding]; 
      NSLog(@"\tcontained message: %@", msg); 
      /* 2. inform communicator about received message */ 
      [communicator received: msg]; 
      [msg release]; 
     } 

     if (len < 0) { 
      [communicator received: @"Error!"]; 
     } 
     break; 
    } 

`

將是很好,如果有人可以幫助我!

回答

10

達爾文是開源的,所以「真相在那裏」。對於NSStream源顯示GSInetInputStream是實現NSInputStream用於插座類,和的GetBuffer執行:長度:該類簡潔地回答問題:

- (BOOL) getBuffer: (uint8_t **)buffer length: (unsigned int *)len 
{ 
    return NO; 
} 

實測值here

+0

嗨,你可以檢查我的[關於在Swift中getBuffer的問題](http://stackoverflow.com/questions/40045665/size-of-the-nsinputstream-buffer)?我有一個很奇怪的問題,高級用戶提出的答案不起作用。問候! – 2016-10-16 01:29:27

0

我認爲的GetBuffer不工作,因爲沒有一個緩衝的是,你正在讀入緩衝區之後,所以它不能得到的指針緩衝又...

+0

沒有意義,因爲只有當我收到「NSStreamEventHasBytesAvailable」事件時纔會執行代碼,所以底層緩衝區中有數據可用(我想通過調用'getBuffer:length:'來獲得引用。 。我剛剛移動了'如果getBuffer:length:'塊在'read:maxLength:'塊下面,並且如預期的那樣:沒有任何變化 – 2010-11-02 07:34:18

+0

此外:我試圖讀取該緩衝區而不是寫入它(我認爲那是什麼你的意思是「讀入緩衝區」?)。 – 2010-11-02 12:16:09

+0

字節可用的事件並不意味着它們仍在緩衝區中,因此有一些字節準備好從流中讀入緩衝區。假設你正在打開一個文件流,當你打開這個流時,流中有可用的字節被讀取,但是沒有任何文件被讀入緩衝區。通過「讀入緩衝區」,我的意思是通過流獲取字節並將它們放入緩衝區。 – Oliver 2010-11-03 06:24:33

0

啊,我想我明白你的意思。但是我想下面的代碼應該至少在讀入緩衝區之後評估爲TRUE? 我只是問,因爲它沒有,getBuffer:length:仍然似乎沒有工作。 使用可用的字節通信效果很好,但仍然是問題...

 uint8_t *buf1; 
     unsigned int numBytes1; 
     if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) { 
      NSLog(@"\t\tBytes are in the buffer before Op."); 
     } 

     uint8_t buffer[BUFFER_SIZE]; 
     int len = [((NSInputStream *) stream) read: buffer 
             maxLength: BUFFER_SIZE]; 

     uint8_t *buf2; 
     unsigned int numBytes2; 
     if ([((NSInputStream *) stream) getBuffer: &buf2 length: &numBytes2]) { 
      NSLog(@"\t\tBytes in the buffer after Op."); 
     } 

對不起創建答案我自己的問題;但評論能夠處理這麼多的代碼...

+0

如果將numbytes更改爲NSUInteger而不是「unsigned int」,會發生什麼情況? – Oliver 2010-11-17 11:49:55

+0

緩衝區不可用,無論是在讀取之前還是之後:maxLength: 。對我來說無所謂atm,因爲我在沒有getBuffer的情況下調試了我的應用程序的那一部分:長度: 。感謝你的時間,奧利弗! – 2010-11-23 06:43:33