iPhone でオンライン ゲームを構築したいと思います。今は bonjour ではなく、2 人のプレーヤー間の接続を確立するためにコードを作成する必要があります。これを行うには、ソケットの方法を使用する必要があります。そして、これがクライアント上の私のコードです。Macで実行すると機能しますが、Iphoneデバイスのテストでは機能しません。どこがうまくいかないのか本当にわかりません。これは私を大いに悩ませます。誰も同じ問題を抱えていますか?ログには、ソケットが既にポートでリッスンしていると書かれていますが、AcceptCallback 関数は呼び出されません。何が問題なのですか?
CFSocketRef sserveripv4;
CFSocketContext CTX4 = { 0, NULL, NULL, NULL, NULL };
sserveripv4 = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP,
kCFSocketAcceptCallBack, AcceptCallback, &CTX4);
CFSocketRef sserveripv6;
CFSocketContext CTX6 = { 0, NULL, NULL, NULL, NULL };
sserveripv6 = CFSocketCreate(kCFAllocatorDefault, PF_INET6, SOCK_STREAM, IPPROTO_TCP,
kCFSocketAcceptCallBack, AcceptCallback, &CTX6);
if (sserveripv4 == NULL)
return -1;
if (sserveripv6 == NULL) {
return -2;
}
int yes = 1;
setsockopt(CFSocketGetNative(sserveripv4), SOL_SOCKET, SO_REUSEADDR,
(void *)&yes, sizeof(yes));
setsockopt(CFSocketGetNative(sserveripv6), SOL_SOCKET, SO_REUSEADDR,
(void *)&yes, sizeof(yes));
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
CFDataRef sincfd = CFDataCreate(kCFAllocatorDefault, (UInt8*)&sin, sizeof(sin));
CFSocketSetAddress(sserveripv4, sincfd);
CFRelease(sincfd);
struct sockaddr_in6 sin6;
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_len = sizeof(sin6);
sin6.sin6_family = AF_INET6;
sin6.sin6_port = htons(PORT);
sin6.sin6_addr = in6addr_any;
CFDataRef sin6cfd = CFDataCreate(kCFAllocatorDefault, (UInt8*)&sin6, sizeof(sin6));
CFSocketSetAddress(sserveripv6, sin6cfd);
CFRelease(sin6cfd);
CFRunLoopSourceRef socketsource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sserveripv4, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), socketsource, kCFRunLoopDefaultMode);
CFRunLoopSourceRef socketsource6 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, sserveripv6, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), socketsource6, kCFRunLoopDefaultMode);
printf("Socket listening on port %d\n", PORT);