[英]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.