簡體   English   中英

從NSInputStream讀取垃圾

[英]Garbage reading from NSInputStream

我正在使用輸入流與POS設備進行通信。

當我發送第一個請求時,響應是正常的。 當我發送第二個請求時,問題就來了,因為第二個響應比第一個短,並且內容仍在流中。 所以我得到以下內容:

第一反應:

<response>A really big response with much more things inside</response>

第二反應;

<response>A not so big response</response>more things inside</response>

我執行以下操作:

1)打開流

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, [port intValue], &readStream, &writeStream);
iStream = (NSInputStream *)readStream;
oStream = (NSOutputStream *)writeStream;
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];

2)然后我寫我的要求:

[oStream write:(uint8_t *)[request UTF8String] maxLength:[request length]];

3)當響應到達時,我捕獲它並將其發送到解析器:

uint8_t buffer[MAX_BUFFER_SIZE];
[iStream read:buffer maxLength:MAX_BUFFER_SIZE - 1];
NSString *response = [NSString stringWithUTF8String:(char *)buffer];
free(buffer);

NSError *error;
NSDictionary *ret =[SimpleXMLConverter dictionaryForXMLString:response error:&error];

之后,在發送第二個請求之前,我嘗試關閉流並再次打開它們

謝謝並恭祝安康

PS:這不是一個阻礙性的問題,因為我可以獲得正確的子字符串,但是我不明白為什么會這樣

這是因為您的buffer字符串不是\\0 (NULL)終止的。 也許uint8_t buffer[MAX_BUFFER_SIZE] = {0}; 將解決您當前的問題。

但是,您應該考慮一個響應可能比MAX_BUFFER_SIZE - 1 即使響應比響應短,也不能保證read:maxLength:一次讀取所有數據。 您必須檢查返回的值,並且收到的數據具有完整的響應。

而且,不要free(buffer) ,因為free()僅用於malloc()內存,不適用於自動變量。

暫無
暫無

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

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