2014-07-17 5 views
0

나는 GCDAsyncSocket을 사용하고 내가 쓰고 이런 식으로 읽어아이폰 OS : GCDAsyncSocket와 태그 내 응용 프로그램에서

- (void) socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ 

    NSLog(@"did read data"); 

    if (tag == 1){ 

     //analyze my data... 

     [self.socket readDataWithTimeout:-1 tag:1]; 
    } 

: 나는 대리자 메서드에서 데이터를 읽을 후

NSData *bufferWriteData = [NSData dataWithBytesNoCopy:bufferWrite length:17 freeWhenDone:YES]; 
[self.socket writeData:bufferWriteData withTimeout:-1 tag:1]; 
[self.socket readDataWithTimeout:-1 tag:1]; 

이 대리자 메서드 내에서 "readDataWithTimeout"을 이렇게 불러 와서 모든 데이터를 읽습니다.

내가 할 경우, 새 통화를 할 문제 아이디 :

[self.socket writeData:bufferWriteData withTimeout:-1 tag:2]; 
[self.socket readDataWithTimeout:-1 tag:2]; 

내가 새로운 쓰기와 태그 = 2로 새로운 읽기를 시작합니다; 델리게이트 메소드 "didReadData"가 my code라고 불리우면 tag = 1의 블록 안에 입력하십시오; 새 태그를 인식하지 못하는 것 같습니다.

왜 그런가?

+0

태그의 쓰기와 읽기 사이에는 아무런 관련이 없습니다. – user523234

+0

다른 독자를 관리하는 방법은 무엇입니까? – CrazyDev

+0

데이터를 보낼 때 데이터 앞에 헤더를 추가하여 데이터가 끝날 때 피어에게 알려야합니다. 헤더에는 데이터의 길이를 나타내는 길이 필드와 데이터 색인을 나타내는 ID 필드가 있어야합니다. id 필드는 코드에서 태그로 작동하지만 서버에서 동일한 ID로 응답을 보내야합니다. – KudoCC

답변

1

처리 방법에는 여러 가지가 있습니다. 귀하의 경우 가장 좋은 방법은 아마도 데이터 세그먼트의 끝을 나타내는 데 종결자를 사용했을 것입니다. 거기서 읽을 수 있습니다 : TCP is a stream.

NSData *MyCommandTerminator(void) 
{ 
    return [NSData dataWithBytes:"\x0D\x0A\x0B\x0A" length:4]; 
} 

//callback from Asyncsocket for incoming data 
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag //sender and receiver 
{ 
    NSLog(@"GCDAsyncSocket didreaddata"); 
    // do what you wish with data and read again using a terminator 
    [sock readDataToData:MyCommandTerminator() withTimeout:-1 tag:1]; //tag is not being used here 
} 

// your method to send data 
-(void)sendData:(NSData *)data 
{ 
     // NSData *bufferWriteData = [NSData dataWithBytesNoCopy:bufferWrite length:17 freeWhenDone:YES]; 
     NSLog(@"Sendata wehere _peerSocket is your instance of GCDAsyncSocket"); 
     NSMutableData *myData = [[NSMutableData alloc] initWithData:data]; 
     [myData appendData:MyCommandTerminator()]; 
     [_peerSocket writeData:myData withTimeout:-1 tag:2]; // tag is not being used here 
    }