2012-07-16 3 views
2

Ok, так что я могу создать сокет в моем Android App, используя следующий код:Android NDK соединение гнезда выдает

bool CSocket::tcplisten(int port, int max, int mode) 
{ 
    if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return false; 
    sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_port = htons(port); 
    if(mode)setsync(1); 
    if(bind(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR) 
    { 
    closesocket(sockid); 
    return false; 
    } 
    if(listen(sockid, max) == SOCKET_ERROR) 
    { 
    closesocket(sockid); 
    return false; 
    } 
    return true; 
} 

Я тогда в состоянии подключиться к нему в тот же процесс, используя следующий код:

bool CSocket::tcpconnect(char *address, int port, int mode) 
{ 
    sockaddr_in addr; 
    hostent* hostEntry; 
    if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) 
     return false; 
    if((hostEntry = gethostbyname(address)) == NULL) 
    { 
    closesocket(sockid); 
    return false; 
    } 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    addr.sin_port = htons((u_short)port); 
    if(mode ==2)setsync(1); 
    if(connect(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR) 
    { 
     closesocket(sockid); 
     return false; 
    } 
    if(mode ==1)setsync(1); 
    return true; 
} 

проблема заключается в том, я не могу подключиться к другим машинам под управлением сокет или на удаленных машинах, таких как google.com. Любые идеи, почему я не могу заставить его работать?

После некоторой настройки и зондирования, я обнаружил, что ошибка происходит на линии:

if(connect(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR) 
{ 
    closesocket(sockid); 
    return false; 
} 

ERRNO составляет 111 ERCONNREFUSED ... Пожалуйста. Любая помощь будет оценена по достоинству. Приложение имеет полный доступ в Интернет, установленный в разрешениях. Любые идеи?

У меня есть те же самые проблемы с моей Linux сборки скомпилированные с тем же кодом ...

+1

Что-то, что сразу бросается в меня, заключается в том, что в вызове 'bind' вы используете' sizeof (sockaddr) ', когда он должен быть' sizeof (sockaddr_in) '. Здесь неважно, поскольку они часто имеют одинаковый размер, но будут отличаться, если вы начнете использовать IPv6. –

+0

Вам нужно добавить код, чтобы получить фактическую ошибку, например. 'connect ', когда он терпит неудачу. Это делается путем проверки переменной ['errno'] (http://linux.die.net/man/3/errno) при сбое вызова. Вы также можете использовать ['perror'] (http://linux.die.net/man/3/perror) для печати соответствующего сообщения об ошибке или [' strerror'] (http://linux.die.net/ man/3/strerror), чтобы настроить печатаемое сообщение. Проверьте фактическую ошибку и отредактируйте свой вопрос, чтобы получить ее, и вам будет легче ответить на ваш вопрос. –

+0

Хорошо, я отправил код ошибки сегодня вечером. Я бы включил его, но я не знал об этом .... – nterry

ответ

5

Вы пытаетесь подключиться к INADDR_ANY. Вы хотите скопировать соответствующую часть хоста в addr.sin_addr.s_addr.

+0

Удивительный! Кажется, сработало! Ты обалденный! – nterry

+1

Для тех, кто хочет увидеть исправление, зайдите в мой github, расположенный здесь: https://github.com/nterry/39DLL-4-Linux/blob/master/android-src/socket.cpp – nterry

Смежные вопросы