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 からではなく、別のビューから実行されます。なぜ私のプロジェクトで動かなくなったのかわかりません。
どんな助けでも大歓迎です。