OS X : NSRUNLOOP로 소켓을 읽는 방법은 무엇입니까?
-
20-09-2019 - |
문제
코코아 앱을 쓰고 있습니다. 애플리케이션에는 소켓이 있으며 소켓을 읽을 수있을 때마다 소켓에서 데이터를 읽고 데이터를 처리하며 사용자 인터페이스를 업데이트하고 싶습니다. 메인 루프에서 읽기 이벤트 확인을 통합하고 싶습니다. 즉 소켓을 기본 루프에 연결하고 소켓이 읽을 수있을 때마다 기본 루프 호출 콜백을하도록합니다.
테스트 응용 프로그램을 작성했지만 어떤 이유로 작동하지 않습니다.
#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 물건을 무시하십시오.