iPod客户端永久发送数据到C服务器?

时间:2011-06-17 15:35:09

标签: networking ios4 stream client-server read-write

我通过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。 有什么想法吗?

1 个答案:

答案 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();
}

似乎已经完成了这个伎俩。现在它不会断开连接。解决了问题。