亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2406 | 回復(fù): 0
打印 上一主題 下一主題

android系統(tǒng)native層的getsockopt調(diào)用有錯(cuò)嗎 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-11-09 23:06 |只看該作者 |倒序?yàn)g覽
本帖最后由 wliang511 于 2011-11-09 23:10 編輯

糾結(jié)了很多天了,跟一個(gè)問(wèn)題跟到這里,但是覺(jué)得google又不可能犯這么低級(jí)的錯(cuò)誤...請(qǐng)大家指出我愚蠢的地方吧

android 2.2 froyo版本

在froyo\dalvik\libcore\luni\src\main\native\org_apache_harmony_luni_platform_OSNetworkSystem.cpp中(這里只貼出相關(guān)的2個(gè)case語(yǔ)句):
我們暫時(shí)只看IPV4的部分:
    在case  JAVASOCKOPT_IP_MULTICAST_IF中,getsockopt(...,....,...,&sockval,...)語(yǔ)句之后有sockval.ss_family的引用,因此這個(gè)sockval至少是
           一個(gè)大小大于4個(gè)字節(jié)的結(jié)構(gòu)體,從緊接的代碼socketAddressToInetAddress()中可以看出內(nèi)核應(yīng)該返回的sockval為struct sockaddr_in類型

  在case JAVASOCKOPT_IP_MULTICAST_IF2,AF_INET時(shí),很明顯getsockopt(...,....,...,&sockval,...)返回的sockval類型必須是struct ip_mreqn類型

但是從內(nèi)核代碼\kernel\net\ipv4\ip_sockglue.c中
   case IP_MULTICAST_IF中可以看到,getsockopt明明只支持返回類型為struct in_addr的結(jié)構(gòu)體

這,問(wèn)題究竟在哪里呢?


froyo\dalvik\libcore\luni\src\main\native\org_apache_harmony_luni_platform_OSNetworkSystem.cpp:

  1. static jobject osNetworkSystem_getSocketOptionImpl(JNIEnv* env, jclass clazz,
  2.         jobject fileDescriptor, jint anOption) {
  3.     // LOGD("ENTER getSocketOptionImpl");

  4.     int intValue = 0;
  5.     socklen_t intSize = sizeof(int);
  6.     int result;
  7.     struct sockaddr_storage sockVal;
  8.     socklen_t sockSize = sizeof(sockVal);

  9.     int handle;
  10.     if (!jniGetFd(env, fileDescriptor, handle)) {
  11.         return 0;
  12.     }

  13.     switch ((int) anOption & 0xffff) {
  14.         case JAVASOCKOPT_IP_MULTICAST_IF: {
  15.             if ((anOption >> 16) & BROKEN_MULTICAST_IF) {
  16.                 return NULL;
  17.             }
  18.             result = getsockopt(handle, IPPROTO_IP, IP_MULTICAST_IF,
  19.                 &sockVal, &sockSize);
  20.             if (result == -1) {
  21.                 jniThrowSocketException(env, errno);
  22.                 return NULL;
  23.             }
  24.             if (sockVal.ss_family != AF_INET) {
  25.                 // Java expects an AF_INET INADDR_ANY, but Linux just returns AF_UNSPEC.
  26.                 jbyteArray inAddrAny = env->NewByteArray(4); // { 0, 0, 0, 0 }
  27.                 return byteArrayToInetAddress(env, inAddrAny);
  28.             }
  29.             return socketAddressToInetAddress(env, &sockVal);
  30.         }

  31.         case JAVASOCKOPT_IP_MULTICAST_IF2: {
  32.             if ((anOption >> 16) & BROKEN_MULTICAST_IF) {
  33.                 return NULL;
  34.             }
  35.             struct ip_mreqn multicastRequest;
  36.             int interfaceIndex = 0;
  37.             socklen_t optionLength;
  38.             int addressFamily = getSocketAddressFamily(handle);
  39.             switch (addressFamily) {
  40.                 case AF_INET:
  41.                     optionLength = sizeof(multicastRequest);
  42.                     result = getsockopt(handle, IPPROTO_IP, IP_MULTICAST_IF,
  43.                                         &multicastRequest, &optionLength);
  44.                     if (result == 0)
  45.                         interfaceIndex = multicastRequest.imr_ifindex;
  46.                     break;
  47.                 case AF_INET6:
  48.                     optionLength = sizeof(interfaceIndex);
  49.                     result = getsockopt(handle, IPPROTO_IPV6, IPV6_MULTICAST_IF,
  50.                                         &interfaceIndex, &optionLength);
  51.                     break;
  52.                 default:
  53.                     jniThrowSocketException(env, EAFNOSUPPORT);
  54.                     return NULL;
  55.             }

  56.             if (0 != result) {
  57.                 jniThrowSocketException(env, errno);
  58.                 return NULL;
  59.             }
  60.             return newJavaLangInteger(env, interfaceIndex);
  61.         }
  62.     }
  63. }
復(fù)制代碼
但是從內(nèi)核代碼\kernel\net\ipv4\ip_sockglue.c中
case IP_MULTICAST_IF中可以看到,getsockopt明明只支持返回類型為struct in_addr的結(jié)構(gòu)體


kernel\net\ipv4\ip_sockglue.c:


  1. /*
  2. *        Get the options. Note for future reference. The GET of IP options gets the
  3. *        _received_ ones. The set sets the _sent_ ones.
  4. */

  5. static int do_ip_getsockopt(struct sock *sk, int level, int optname,
  6.                             char __user *optval, int __user *optlen)
  7. {
  8.         struct inet_sock *inet = inet_sk(sk);
  9.         int val;
  10.         int len;

  11.         if (level != SOL_IP)
  12.                 return -EOPNOTSUPP;

  13.         if (ip_mroute_opt(optname))
  14.                 return ip_mroute_getsockopt(sk,optname,optval,optlen);

  15.         if (get_user(len,optlen))
  16.                 return -EFAULT;
  17.         if (len < 0)
  18.                 return -EINVAL;

  19.         lock_sock(sk);

  20.         switch (optname) {

  21.               case IP_MULTICAST_IF:
  22.               {
  23.                 struct in_addr addr;
  24.                 len = min_t(unsigned int, len, sizeof(struct in_addr));
  25.                 addr.s_addr = inet->mc_addr;
  26.                 release_sock(sk);

  27.                 if (put_user(len, optlen))
  28.                         return -EFAULT;
  29.                 if (copy_to_user(optval, &addr, len))
  30.                         return -EFAULT;
  31.                 return 0;
  32.               }
  33.                 }
  34. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP