0

我有一个通过 TCP/IP 使用 linux C 服务器设置的 iOS 客户端。我面临的问题是:连接完成后,服务器等待数据(读取())并在从 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] Data sent //从服务器第一次 read() 后发送的数据

2011-06-17 16:23:50.159 sliderFinal[7430:207] << : NSStreamEventHasSpaceAvailable //这是指来自服务器的第一个 read() 调用

我看到在第一轮之后,服务器一直在等待一些东西。这条消息似乎没有再次到达 NSStreamEventHasSpaceAvailable。有任何想法吗?

4

1 回答 1

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)之后的服务器,它会向我显示一条消息,说连接已终止,所以我更改了服务器端的代码,我检查了服务器是否仍然与客户端连接,如下所示:

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

它似乎已经成功了。现在它不会无缘无故地断开连接。问题解决了。

于 2011-06-18T17:26:35.743 回答