我正在使用输入流与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:它不是阻塞问题,因为我可以获得正确的子串,但我不明白为什么会发生这种情况
答案 0 :(得分:0)
那是因为你的buffer
字符串不是\0
(NULL)终止。
也许uint8_t buffer[MAX_BUFFER_SIZE] = {0};
会解决您当前的问题。
但是,您应该考虑一个响应可能比MAX_BUFFER_SIZE - 1
更长。
即使响应时间比它短,也不能保证read:maxLength:
一次读取所有数据。您必须检查返回的值,并且接收的数据具有完整响应。
此外,请勿free(buffer)
,因为free()
仅适用于malloc()
内存,不适用于自动变量。