1

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);
4

0 に答える 0