繁体   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