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 읽어 보시기 바랍니다. 나는 모든 단계를 거쳤으며 나의 프로그램은 애플이 제공 한 코드와 거의 동일하다. 문제는 여전히 남아 있습니다.