2013-07-25 3 views
1

this (quite old) example by Apple을 사용하여 TCP 서버를 만들었습니다. 내 서버가 작동하여 지정된 포트에서 들어오는 연결을 수신 대기합니다.NSInputStream이 TCP 연결에서 읽을 수 없습니다. [TCP-Server]

모든 것이 완벽 해 클라이언트 응용 프로그램이 서버에 연결될 수 있으며 -stream:handleEvent:이 예상대로 호출됩니다.

하지만 이제 스트림에 쓸 때 서버 종류가 연결을 거부합니다. 클라이언트는 30 바이트가 성공적으로 기록되었다고 말합니다.

는하지만 내 로그 말 : (A CFSocketCallBack가

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.0.10.40", 58896, &readStream, &writeStream); 

_iStream = (__bridge NSInputStream *)readStream; 
_oStream = (__bridge NSOutputStream *)writeStream; 

[_iStream setDelegate:self]; 
[_oStream setDelegate:self]; 

[_iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[_oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

[_iStream open]; 
[_oStream open]; 

이 소켓을 만들고 서버 측 : 클라이언트 측에서

did read 0 Bytes from inputStream. 
data received: 
NSStreamEventErrorOccurred 
Error: Error Domain=NSPOSIXErrorDomain code=14 "The operation couldn't be completed. Bad address" 

내가 연결을 설정하기 위해 다음 코드를 사용하고 있습니다 제공됨)

_IPv4Socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack)&JWTCPServerAcceptCallBack, nil); 

콜백에서 다음을 사용하여 페어링합니다 :

CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream); 
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 

그런 다음 스트림을 NSStreams로 캐스팅하고, 대리인을 설정하고, 현재 runloop에서 일정을 설정하고 엽니 다.

여기 왜 전체 서버 코드가 제공되지 않는지 잘 모르겠습니다. 그것은 단순히 너무 많을 것입니다.

특정 코드가 필요하거나 발생할 수있는 부분을 추측 할 때는 여기에 해당 코드를 게시합니다.

UPDATE

나는 지금 내 자신의 코드에 많은 연구를했다. 내 -stream:handleEvent 메서드 호출 아래로 문제를 추적했습니다. 2

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { 
    uint8_t *buffer = NULL; 
    NSMutableData *receivedData; 

    switch(eventCode) { 
     case NSStreamEventHasBytesAvailable: 

     if(aStream == _iStream) { 
      receivedData = [NSMutableData data]; 

      while([_iStream read:buffer maxLength:1] > 0) { 
      // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ THIS RETURNS -1 
       if([[[NSString alloc] initWithBytes:buffer length:sizeof(buffer) encoding:NSUTF8StringEncoding] isEqualToString:@"\n"]) { 
        break; 
       } 

       [receivedData appendBytes:buffer length:sizeof(buffer)]; 
      } 

      NSLog(@"Did receive %li Bytes of data: %@", [receivedData length], [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]); 
     } 
    } 
} 

UPDATE 나는 TCP 서버 및 클라이언트에 대한 this great Apple Article 읽어 보시기 바랍니다. 나는 모든 단계를 거쳤으며 나의 프로그램은 애플이 제공 한 코드와 거의 동일하다. 문제는 여전히 남아 있습니다.

답변

2

해결책을 찾았습니다! 실제로 버퍼를 완전히 잘못 선언했습니다. 내가 생각 그래서 오류 메시지의 의미 주소는

uint8_t *buffer = NULL; 

uint8_t buffer[1]; 
로 설정되어 있어야합니다 ..., 네트워크 주소 아니었다