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运行。我不知道为什么它会停留在我的项目中。
任何帮助都将不胜感激。
发布于 2012-04-23 05:32:35
不要自己在主线程上运行run循环。主事件循环将运行它。
编辑:我应该说,“在GUI应用程序的上下文中”。在命令行工具中,您确实需要自己运行run循环。
https://stackoverflow.com/questions/10272164
复制相似问题