【发布时间】: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