我的代码有问题。 正如您可以看到使用内部线程recv启动,以便程序在给定的情况下被阻止,但将继续执行,让任务锁定线程。 我的程序将继续接收recv数据套接字new_sd,因此我进入了一个无限循环(注释代码)。 问题是通过在recv之前输入while(1)我的程序块,但是没有正确插入它会收到一个字符串,但是在那之后停止。 有人可以帮我让我的recv总是在等待信息吗? 在此先感谢您的帮助。
- (IBAction为)聊天{
[NSThread detachNewThreadSelector:@selector(riceviDatiServer) toTarget:self withObject:nil];
}
- (无效)riceviDatiServer {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
labelRicevuti.text = [[NSString alloc] initWithFormat:@"In attesa di ricevere i dati"];
char datiRicevuti[500];
int ricevuti;
//while(1){
ricevuti = recv(new_sd, &datiRicevuti, 500, 0);
labelRicevuti.text = [[NSString alloc] initWithFormat:@"%s", datiRicevuti];
//}
[pool release];
}
答案 0 :(得分:1)
你不应该使用while(1)循环,因为它会阻止你的线程接收信息 你应该看一下NSRunLoop类。
[编辑]
根据要求,这是一个使用运行循环的基本Obj-C程序的示例。 :)
#import <Cocoa/Cocoa.h>
BOOL loopShoudRun = YES;
int main( void )
{
NSAutoreleasePool * pool;
NSRunLoop * loop;
pool = [ [ NSAutoreleasePool alloc ] init ];
loop = [ NSRunLoop currentRunLoop ];
while( loopShoudRun == YES && [ loop runMode: NSDefaultRunLoopMode beforeDate: [ NSDate distantFuture ] ] );
[ pool release ]
return 0;
}
答案 1 :(得分:0)
labelRicevuti.text = [[NSString alloc] initWithFormat:@"In attesa di ricevere i dati"];
除非labelRicevuti是普通的C结构,否则此行会泄漏您分配的字符串。
char datiRicevuti[500];
int ricevuti;
//while(1){
ricevuti = recv(new_sd, &datiRicevuti, 500, 0);
你永远不会检查ricevuti,看看它是否为-1。
labelRicevuti.text = [[NSString alloc] initWithFormat:@"%s", datiRicevuti];
这一行可能会出现故障,因为datiRicevuti几乎肯定不是一个空终止的字符序列。首先,在使用之前,您永远不会将缓冲区归零。其次,如果有500个或更多可用字节,则允许recv完全填充它,因此没有空间用于终止nul。
此外,您泄漏已分配的字符串,除非labelRicevuti是普通的C结构,在这种情况下,您会泄漏在上一次迭代中分配的字符串或函数顶部的字符串。