2011-09-22 91 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