문제

코코아 앱을 쓰고 있습니다. 애플리케이션에는 소켓이 있으며 소켓을 읽을 수있을 때마다 소켓에서 데이터를 읽고 데이터를 처리하며 사용자 인터페이스를 업데이트하고 싶습니다. 메인 루프에서 읽기 이벤트 확인을 통합하고 싶습니다. 즉 소켓을 기본 루프에 연결하고 소켓이 읽을 수있을 때마다 기본 루프 호출 콜백을하도록합니다.

테스트 응용 프로그램을 작성했지만 어떤 이유로 작동하지 않습니다.

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

이 앱은 LocalHost Port 1234에서 청취해야하며 누군가 서버에 연결하거나 데이터를 서버로 보낼 때마다 앱은 콘솔에서 "haiz"를 인쇄해야합니다. 그러나 앱은 전혀 아무것도하지 않습니다. 소켓이 생성되고 포트 1234에 텔넷을 텔넷에 넣을 수 있지만 앱은 콘솔에 아무것도 인쇄하지 않습니다.

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

문서에서 :

NSSocketport 객체는 분산 객체 연결의 엔드 포인트로 사용할 수 있습니다.

그것은 당신이 여기서하는 일이 아닙니다.

당신은 원합니다 어느 하나 nsfilehandle BSD 소켓 API의 소켓 파일 디스크립터 주변CFSocket. 이렇게하면 소켓을 런 루프에 넣을 수 있습니다.

다른 팁

당신은 사용하고 싶습니다 NSSocketPort 당신이하고있는 방식으로 NSFileHandle 소켓의 연결을 수락합니다. 당신이 기대하는 것처럼 메인 스레드에서 콜백을 얻을 수 있고, 먼저 새로운 연결을 위해, 그리고 해당 연결에 대한 데이터를 얻을 수 있습니다. 이것을 사용하십시오 오라일리 기사 그리고 HTTP 물건을 무시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top