2011-07-03 6 views
0

類似の質問がされていますが、問題は非常にコード固有であるようですので、うまくいけばOKです。iOS - コールバックを取得していないCFSocket

UDPブロードキャストをリッスンしてデータに作用するiOSアプリケーションを作成しようとしています。より高度な実装は、バックグラウンドスレッドとrawソケットを使ってこの種の機能を実装することを示唆しているようですが、私はCFSocketを使って単純なものを保つことを最初の試みとして考えました。私はアップルのUDPEchoの例を研究しましたが、壁に衝突しました。

私はRunLoopにCFSocketを追加しますが、私のコールバックは決して呼び出されません。通常、このタイプのコードでは、これはデバッグするのがかなり難しいです。私はUDPEchoで提案されている多くのエラーチェックを使用しており、すべてが正しくセットアップされているようです。コードは次のとおりです。

私は、接続を管理するDataListenerというオブジェクトを持っています。これはDataListenerのINITである(エラーと削除チェック:

int sock; 
int err; 
CFRunLoopSourceRef rls; 
const CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

sock = socket(AF_INET, SOCK_DGRAM, 0); 

# Setup address struct and bind to socket for broadcast 
struct sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 
addr.sin_len = sizeof(addr); 
addr.sin_family = AF_INET; 
addr.sin_port = 51234; 
addr.sin_addr.s_addr = INADDR_ANY; 
err = bind(sock, (const struct sockaddr *) &addr, sizeof(addr)); 

# Set flags to non-blocking 
int flags; 
flags = fcntl(sock,F_GETFL); 
err = fcntl(sock, F_SETFL, flags | O_NONBLOCK); 

# CFSocket is created, stored in the object 
self->_cfSocket = CFSocketCreateWithNative(NULL,sock,kCFSocketReadCallBack, 
              SocketReadCallback, &context); 
sock = -1; 
# CFSocket is added to the Main RunLoop 
rls = CFSocketCreateRunLoopSource(NULL,self->_cfSocket,0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); 
CFRelease(rls); 

この関数は、Cのコールバックを取得するためのものです(期待通り、この関数は呼び出されません):

static void SocketReadCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){ 
    DataListener* obj; 
    obj = (DataListener*) info; 
    NSLog(@"Got callback in C"); 
    [obj readData]; 
} 

DataListenerて、readData機能その後、データを扱うのObj-Cの関数である。

がですが、私のセットアップコードで間違った何かが?CFSocketが正しく実行ループに置かれていることを確認する方法はありますか?

読んでいただきありがとうございます。将来的にはスレッドを使うべきだが、この例ではCFSocketでこれを行う方法を理解したいと思う。

更新:ここで何が間違っていたかは決して分かりませんでした。 asyncsocket:http://code.google.com/p/cocoaasyncsocket/に移動し、人生は良いです。

答えて

1

にkCFSocketReadCallBack変更CFRunLoopGetMainにCFRunLoopGetCurrentを()を交換してください()

関連する問題