我通过TCP / IP设置了一个带有Linux C服务器的iOS客户端。我面临的问题是: 连接完成后,服务器等待数据(read())并在从iPod接收到屏幕后显示。然后再次返回read(),依此类推。我可以一次读/写,但不能永久。代码是:
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
case NSStreamEventHasSpaceAvailable:
event = @"NSStreamEventHasSpaceAvailable";
connectButton.enabled = NO;
disconnectButton.enabled = YES;
if (theStream == oStream)
{
//send data
uint8_t buffer[11] = "I send this";
int len;
len = [oStream write:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSLog(@"Data sent");
[oStream close];
}
}
break;
行。因此,据我所知,一旦在服务器端读取,此方法和案例将自动运行。这在服务器上的第一次read()调用中效果很好,但在第二次调用时,服务器只是保留一些数据。 我在xcode中的日志显示了会发生什么:
2011-06-17 16:23:50.154 sliderFinal [7430:207]>> :NSStreamEventOpenCompleted //其中一个流已打开
2011-06-17 16:23:50.156 sliderFinal [7430:207]<< :NSStreamEventOpenCompleted //另一个流已打开
2011-06-17 16:23:50.157 sliderFinal [7430:207]已发送数据 //数据是在第一次读取()后从服务器发送的
2011-06-17 16:23:50.159 sliderFinal [7430:207]<< :NSStreamEventHasSpaceAvailable //这是指来自服务器的第一个read()调用
我看到在第一轮之后,服务器一直在等待某事。这条消息似乎没有再次到达NSStreamEventHasSpaceAvailable。 有什么想法吗?
答案 0 :(得分:0)
这是使用的方法:
-(NSInteger) writeToServer:(const uint8_t *) buf
{
return [oStream write:buf maxLength:strlen((char*)buf)];
}
这是我使用的代码(而不是问题中发布的代码):
case NSStreamEventHasSpaceAvailable:
event = @"NSStreamEventHasSpaceAvailable";
connectButton.enabled = NO;
disconnectButton.enabled = YES;
if (theStream == oStream)
{
//send data
NSString *msg = [[NSString alloc] initWithFormat:@"ping"];
const uint8_t *buffer = (const uint8_t *)[msg UTF8String];
NSInteger err = [self writeToServer:buffer];
[msg release];
if ( err == -1)
NSLog(@"Error sending data.");
else
NSLog(@"Success sending data.");
break;
另外我注意到 read()和 printf(msg)之后的服务器,它会给我一个msg说连接已经终止,所以我更改了我在检查服务器端的代码是否服务器仍与客户端连接,如下所示:
check = recv(newsockf,buffer,256, MSG_PEEK|MSG_DONTWAIT);
if(!(check < 0 && errno == EAGAIN))
{
//close socket;
//accept();
}
..对此:
if((check < 0 && errno != EAGAIN))
{
//close socket;
//accept();
}
似乎已经完成了这个伎俩。现在它不会断开连接。解决了问题。