【问题标题】:Errno 97 with Android NDK socket programmingErrno 97 与 Android NDK 套接字编程
【发布时间】:2012-10-28 19:30:08
【问题描述】:

我在谷歌上搜索过,找不到解决这个问题的方法:

我正在尝试在我的 Android 设备上进行一些基本的套接字编程(客户端/服务器应用程序),但我无法启动服务器应用程序。在我的本机代码中,我调用了 bind(...),我从日志中看到它返回 -1。当我检查errno时,值为97(EAFNOSUPPORT),表示“协议不支持地址族”。当我检查 sin_family 的值时,它是 AF_INET,即 IPv4。 Android NDK 不支持吗?如果不是,还有什么可能是导致此错误的原因?

Socket初始化为:

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));

listenAddr 是一个 sockaddr_in 结构体,初始化为:

sin_family = AF_INET;
sin_port = htons(9099);
sin_addr.s_addr = INADDR_NONE;

调用绑定:

bindResult = bind(sock, (sockaddr *)listenAddr, sizeof(listenAddr))

绑定结果返回-1。对 errno 的后续调用返回 97。

【问题讨论】:

  • 发布您的代码,或搜索已知好的示例并进行自己的详细比较。有几个地方你可能会犯一些微妙的错误,尤其是涉及到的一些结构的大小。
  • 在 Linux 上运行此代码并遇到同样的问题 :(

标签: android sockets android-ndk


【解决方案1】:

使用 INADDR_ANY(或特定接口的地址)而不是 INADDR_NONE。

INADDR_NONE 是一个无符号常量,其位模式与有符号值 -1 相同,作为某些调用的错误指示而返回。

【讨论】:

  • 好的,谢谢您的回复。我能够使用这些参数使 bind(...) 套接字 api 调用工作。实际情况是,我被要求将我的同事代码从 Windows 移植到 Linux/Android,并且他在套接字(包装类和重载运算符)方面有自己的做事方式。他的代码在 Windows 中运行良好,但在 Linux 环境中运行时,我得到 errno 97。对于 bind(...) 的第二个参数,他传入对从 struct sockaddr_in 继承的对象的引用并将其强制转换为 (结构 sockaddr *)。这在 Linux(或 GCC)中是否允许?
  • 另外,对于 bind(...) 的第三个参数,他传入 sizeof(sockaddr),而不是 sizeof(),第二个参数传入 bind(...)
  • 这里有两个问题。如果你传递一个指向内存中与系统调用期望的结构匹配的指针,并提供准确的大小,它就可以工作。第二个问题是您的语言是否允许您使用所需的参数进行系统调用 - C 假设您知道自己在做什么并且很乐意允许这样做,但是如果 C++ 被告知源数据是一种不兼容的形式。
  • 问题实际上与我的同事代码工作的重载运算符之一有关。我们今天早上解决了,但无论如何我都会接受:p
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2015-03-21
  • 2014-07-22
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多