首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cocoaasyncsocket多个写入操作

Cocoaasyncsocket多个写入操作
EN

Stack Overflow用户
提问于 2013-11-13 14:35:58
回答 1查看 881关注 0票数 0

我已经在我的应用中实现了gcdasynsocket,并执行了多个写操作。委托didWriteDataWithTag被调用两次,但仅对一次写操作调用一次(即)。

代码语言:javascript
复制
 -(void)connectToHost:(NSString*)ip andPort:(NSString*)port
 {
    if(![asyncSocket isConnected])
    {
      dispatch_queue_t mainQueue = dispatch_get_main_queue();
      asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
      NSError *error = nil;
      uint16_t portNumber = (uint16_t)[port integerValue];
      if (![asyncSocket connectToHost:ip onPort:portNumber withTimeout:-1 error:&error])
     {
        NSLog(@"Error connecting: %@", error);

     }
     else
     {
        NSLog(@"Connecting...");
     }
}} 

GCDasyncsocket委托方法

代码语言:javascript
复制
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
  NSLog(@"connected to host");
  [asyncSocket writeData:dataToBeWritten1 withTimeout:-1 tag:1000];
  [asyncSocket writeData:dataToBeWritten2 withTimeout:-1 tag:2000];
}

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
  [asyncSocket readDataWithTimeout:-1 tag:tag];
}  

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
   if (tag==1000)
  {
     NSLog(@"didReadData and tag-----%@-----%ld",data,tag);
     [asyncSocket readDataWithTimeout:-1 tag:2000];

  }
  else if(tag==2000)
 {
    NSLog(@"didReadData and tag-----%@-----%ld",data,tag);
    [asyncSocket readDataWithTimeout:-1 tag:1000];
 }
}

我不确定哪里出了问题。请帮我解决这个问题

EN

回答 1

Stack Overflow用户

发布于 2013-11-15 15:49:21

我认为您被TCP协议的内部工作原理给绊倒了。TCP是基于流的协议,而不是基于消息的协议。换句话说,它保证字节以与发送时完全相同的顺序到达,但不能保证如何将这些字节分组为数据包或读取操作。

具体地说,我怀疑您的两个写入被聚合到一个读取中,无论是在发送器还是接收器中。换句话说,这种行为是完全正常的,也是意料之中的。

除了依赖于每次写入都会在接收器中导致一次读取之外,您还需要使用其他方法将数据分离到逻辑单元中。一种常见的技术是以长度字段开始每条消息,该字段不仅允许接收者阅读每条消息,而且还允许接收者知道消息的长度,并能够找到下一条消息的开始位置。

关于如何做到这一点,这里有一个很好的解释:Proper technique for sending multiple pieces of data of arbitrary length over TCP socket

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19946998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档