2010-11-27 11 views
0

私はJavaサーバーを持っています。私はサーバーに接続するIPhoneアプリケーションを構築しようとしています。また、メッセージを送受信します。私はCFReadStreamRefとCFWriteStreamRefの使用についてちょっと混乱しました。どうすればソケットとストリームを正常にペアリングできますか。これは私が持っているものです:私は、ストリームからの書き込みまたは読み取りしようとすると、BSDソケットCFReadStreamRefとCFWriteStreamRef

fd = socket(AF_INET, SOCK_STREAM, 0); 
emset(&addr, 0, sizeof(addr)); 
addr.sin_len = sizeof(addr); 
addr.sin_family = AF_INET; 
addr.sin_port = htons(port);//0; 
inet_aton("192.168.1.101", &addr.sin_addr.s_addr); 

CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

listeningSocket = CFSocketCreateWithNative(NULL, fd,kCFSocketConnectCallBack, AcceptCallback, &context); 

CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr)); 
CFSocketConnectToAddress(self.listeningSocket, connectAddr, -1); 

// As soon as i get the Connect call back into my function I try to pair the streams to the socket 
CFReadStreamRef  readStreamm; 
CFWriteStreamRef writeStreamm; 

CFStreamCreatePairWithSocket(NULL, CFSocketGetNative(listeningSocket), &readStreamm, &writeStreamm); 
[readStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[writeStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

[readStream open]; 
[writeStream open]; 

ただし、エラーを返して(-1)。 readStreamまたはwriteStreamopenを使用し、成功した場合はもう1つ質問します。それは私がすでにサーバーに接続しているということですか?または私は実際にCFSocketConnectToAddressに電話する必要がありますか?私はconnectToAdderssとストリームの両方を使用する必要があるかどうかを判断しようとしています。あるいは、どちらか一方を使うべきです。

ありがとうございます。

答えて

0

cocoaasyncsocketをお勧めします。そのソケットベースの通信をはるかに簡単にするための軽量ラッパーです。ちょうど今、私はiPhoneとネットワークデバイスの間の通信に取り組んでいます。それは完璧に動作します。

[sock writeData:[@"Hello World" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1]; 
0

cocoaasyncsocketの実装について説明します。読み取り/書き込みストリームを開く前に、ソケットを閉じておく必要があります。 CFSocketConnectToAddressを使用してから、ソケットを無効にしてから解放してください。それから私の流れを確立する。 qoute:

// Invalidate and release the CFSocket - All we need from here on out is the nativeSocket 
// Note: If we don't invalidate the socket (leaving the native socket open) 
// then theReadStream and theWriteStream won't function properly. 
// Specifically, their callbacks won't work, with the exception of kCFStreamEventOpenCompleted. 
// I'm not entirely sure why this is, but I'm guessing that events on the socket fire to the CFSocket we created, 
// as opposed to the CFReadStream/CFWriteStream. 

CFSocketInvalidate(listeningSocket); 
CFRelease(listeningSocket); 
listeningSocket = NULL: 
関連する問題