0

ViewController.h

@interface ViewController : UIViewController{
CFSocketRef s;
int connectFlag;
}

ViewController.m

void receiveDataCilent(CFSocketRef cs, 
                   CFSocketCallBackType type, 
                   CFDataRef address, 
                   const void *data, 
                   void *info)
{  

CFDataRef df = (CFDataRef) data;
int len = CFDataGetLength(df);
if(len <= 0) return;

CFRange range = CFRangeMake(0,len);
UInt8 buffer[len];
NSLog(@"Received %d bytes from socket %d\n", 
      len, CFSocketGetNative(cs));
CFDataGetBytes(df, range, buffer);
NSLog(@"Client received: %s\n", buffer); 
NSLog(@"As UInt8 coding: %@", df);
NSLog(@"len value: %d", len);


}

-(void) clientConnect:(int)sender;{



s = CFSocketCreate(NULL, PF_INET, 
                    SOCK_STREAM, IPPROTO_TCP, 
                    kCFSocketDataCallBack, 
                    receiveDataCilent, 
                    NULL);

struct sockaddr_in      sin; 
struct hostent          *host;

memset(&sin, 0, sizeof(sin));

host = gethostbyname("localhost");      

memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 

sin.sin_family = AF_INET;
sin.sin_port = htons(6666);

CFDataRef address;
CFRunLoopSourceRef source;

address = CFDataCreate(NULL, (UInt8 *)&sin, sizeof(sin));
CFSocketConnectToAddress(s, address, 0);

CFRelease(address);

source = CFSocketCreateRunLoopSource(NULL, s, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), 
                   source, 
                   kCFRunLoopDefaultMode);
CFRelease(source); 
CFRunLoopRun(); 

}

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

if(connectFlag == 0 ){
[self clientConnect:1];
}

}

最初に、xcode プログラミングとスレッド プログラミングの概念を台無しにして申し訳ありません。私は xcode に非常に慣れていないため、ゲーム プロジェクトをすぐに完了する必要があります。

このコードは、サーバーに接続し、サーバーからのメッセージを待機することを想定しています。私はそれを試してテストしましたが、うまくいきます。ビューには、ビューを押して変更できる IBAction があります。

しかし、それをメインプロジェクトに実装した後。実行できますが、ボタンを押すことも何もできません。ログアウトしたら。CFRunLoopRun(); の周りにスタックしているようです。ループに陥ったと思いますが、テストするとなぜですか。くっついていませんか?

私のプロジェクトでは、このコードは、私がテストしたように ViewController からではなく、別のビューから実行されます。なぜ私のプロジェクトで動かなくなったのかわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

メインスレッドで自分で実行ループを実行しないでください。メイン イベント ループがそれを実行します。

編集:「GUIアプリのコンテキスト内で」と言うべきです。コマンドライン ツールでは、実行ループを自分で実行する必要があります。

于 2012-04-22T21:32:34.857 に答える