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 сборки скомпилированные с тем же кодом ...
Что-то, что сразу бросается в меня, заключается в том, что в вызове 'bind' вы используете' sizeof (sockaddr) ', когда он должен быть' sizeof (sockaddr_in) '. Здесь неважно, поскольку они часто имеют одинаковый размер, но будут отличаться, если вы начнете использовать IPv6. –
Вам нужно добавить код, чтобы получить фактическую ошибку, например. '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), чтобы настроить печатаемое сообщение. Проверьте фактическую ошибку и отредактируйте свой вопрос, чтобы получить ее, и вам будет легче ответить на ваш вопрос. –
Хорошо, я отправил код ошибки сегодня вечером. Я бы включил его, но я не знал об этом .... – nterry