0

视图控制器.h

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

视图控制器.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 回答