Android NDK - connect () блокирует систему - PullRequest
0 голосов
/ 22 сентября 2011

Я столкнулся со странной проблемой, которую что-то не может объяснить;)

Сейчас я занимаюсь разработкой клиентской программы, работающей на телефоне Android.это приложение подключается к удаленному серверу и что-то делает.

базовая библиотека, созданная в C ++ (NDK) и Android UI, работает нормально при использовании режима WIFI, но система зависает при режиме данных 3G.

я получил, гдеэто замораживание вызывает, это было в функции connect ().

странно, сокет уже установлен в режим NON-BLOCK перед строкой connect ().

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секунд.(это может показать, что время ядра по умолчанию используется где-то в ядре, я думаю.) Как я могу это исправить?что я должен искать?

любые предложения приветствуются.

заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Ваш код блокировки выглядит неправильно - вы должны использовать F_SETFL в качестве команды для установки флагов.Итак:

int flags = fcntl(sock, F_GETFL);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
0 голосов
/ 22 сентября 2011

Попробуйте следующие изменения:

переведите сокет в неблокирующий режим:

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

вернитесь в режим блокировки:

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

Вот как это работает длямне установить режим блокировки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...