0

我对这段代码有疑问。如您所见,使用内部线程 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];

}
4

2 回答 2

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;
}
于 2010-04-15T15:17:57.453 回答
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 结构,在这种情况下,您会泄漏在前一次迭代中分配的字符串或函数顶部的字符串。

于 2010-04-15T21:21:42.850 回答