【问题标题】:debugging C native function android ndk - sendto()调试 C 原生函数 android ndk - sendto()
【发布时间】:2014-01-17 14:51:42
【问题描述】:

我已经为 android NDK 实现了一个 C 原生函数,用于发送 UDP 数据包。 我有一个可以工作的接收器,但是当我使用发送器时,我似乎什么也得不到。

  • 如何从 sendto 的返回值中获取更多信息?我很难调试本机函数 - 没有“调试步骤模式”
  • 有人能看出发件人代码有什么问题吗?是不是我做得不对?

谢谢!

jstring
Java_com_example_adhocktest_SenderUDP_SendUdpJNI( JNIEnv* env,
                                                  jobject thiz, jstring ip, jstring message)
{
    int PORT = 8888;

    int i;
    int sock_fd;

    char *_ip = (*env)->GetStringUTFChars(env, ip, 0);
    char *send_buf = (*env)->GetStringUTFChars(env, message, 0);

    ////////////////
    //////// create socket
    ////////////////
    if (( sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
        return (*env)->NewStringUTF(env,"Cannot create socket");
    }

    struct sockaddr_in myaddr;

    ////////////////
    //////// send
    ////////////////
    struct sockaddr_in servaddr;

    memset((char*)&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = 8888;

    if ((inet_aton(_ip,&servaddr.sin_addr)) == 0) {
        return (*env)->NewStringUTF(env,"Cannot decode IP address");
    }

    int retval = sendto(sock_fd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
        close(sock_fd);

        char str[100];

    if ( retval < 0) {

            sprintf(str, "sendto failed with %d", retval);
    } else {
            sprintf(str, "sendto success with %d", retval);
        }
        return (*env)->NewStringUTF(env,str);
}

【问题讨论】:

  • 使用日志记录到 logcat:stackoverflow.com/questions/4629308/…
  • 我确实使用了 logcat,但我从 sendto() 获得了正确的返回值。 ---找到了解决方案----- servaddr.sin_port = htons(8888);我不完全理解整个 htons 的事情,所以如果有人能详细说明它会很可爱。

标签: android c android-ndk udp


【解决方案1】:

代码中的问题是这一行

servaddr.sin_port = 8888;

正确的行应该是

servaddr.sin_port = htons(8888);

这里解释了原因

天生的痞子:

" htons() 代表“host-to-network short”。在给定的平台上 (称为主机),它转换短(16位 通常)整数到发送所需的字节序 网络(通常是大端)。

sendto() 返回发送的字节数。你应该检查一下 retval 是“send_buf”变量的字符串长度,而不仅仅是 正值。”

感谢大家的帮助, 本。

【讨论】:

    【解决方案2】:

    如果仍然无法正常工作,您是否为您的应用授予了操作套接字所需的权限?

    <uses-permission android:name="android.permission.INTERNET" />
    

    htons() 代表“主机到网络短”。在给定平台(称为主机)上,它将短整数(通常为 16 位)的字节序转换为在网络上发送所需的字节序(通常为大字节序)。

    sendto() 返回发送的字节数。你应该检查 retval 是你的 'send_buf' 变量的字符串长度,而不仅仅是一个正值。

    【讨论】:

    • 正如我所说,htons 解决了这个问题。我有正确的权限我只是设置端口号而不考虑字节序。感谢您对 htons() 函数的解释。
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多