2011-06-17 119 views
0

我有一个iOS客户端通过TCP/IP与Linux C服务器建立。我面临的问题是: 连接完成后,服务器会等待数据(read())并将其显示在从iPod接收到的屏幕上。然后再次返回到read()等等。我可以一次读取/写入,但不能永久。代码是:iPod客户端永久向C服务器发送数据?

-(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

得到它的工作,但只有6个小时后,我可以回答我自己的问题-_-生病了。 – StinkyCat

回答

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; 

而且我注意到,该服务器后()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(); 
} 

它似乎已经伎俩。现在它不会断断续续。问题解决了。

相关问题