2011-09-22 59 views
0

我面临一个奇怪的问题,无法解释的东西;)Android NDK - 连接()块系统

现在我正在开发客户端程序工作的Android手机。 这个应用程序连接远程服务器并做一些事情。

使用WIFI模式在C++(NDK)和Android UI中制作的核心库 但3G数据模式时系统冻结。

我得到了这个冻结的原因,它在connect()函数中。

这个奇怪的东西是socket在connect()之前已经设置了NON-BLOCK模式。

m_nSock = socket(AF_INET, SOCK_STREAM, 0);       
if (m_nSock <= 0)             
{ 
    close(m_nSock);            
    return -1;              
}                 

flags = fcntl(m_nSock, F_GETFL, 0);        
fcntl(m_nSock, F_SETFL, flags | O_NONBLOCK);        

struct sockaddr_in AddrClient; 
memset(&AddrClient, 0x00, sizeof(AddrClient));      
AddrClient.sin_family = AF_INET; 
AddrClient.sin_addr.s_addr = inet_addr(szIP);      
AddrClient.sin_port = htons(nPort);        

nRet = connect(m_nSock, (struct sockaddr*)&AddrClient, sizeof(AddrClient)); 

阻塞总是需要约21秒。 (它可能会显示默认时间在内核的某处使用,我想。)我该如何解决这个问题?我应该搜索什么?

任何建议是值得欢迎的。

在此先感谢。

回答

0

尝试这些变化:

放插座非阻塞模式:

dword mode = 1; 
ioctl(socket, FIONBIO, &mode); 

回成阻塞模式:

mode = 0; 
ioctl(socket, FIONBIO, &mode); 

这是它的工作原理为我设置阻塞模式

+0

我试过了,但失败了。感谢您的回答无论如何:) – JayMuzie

0

您的屏蔽代码看起来不正确 - 您应该使用F_SETFL作为通信并设置标志。所以:

int flags = fcntl(sock, F_GETFL); 
fcntl(sock, F_SETFL, flags | O_NONBLOCK); 
+0

对不起,这是我的错误。我修改了。 – JayMuzie