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