- 论坛徽章:
- 0
|
my原博文地址:
http://blog.sina.com.cn/s/blog_4868f98601017s5v.html
android jni下的udp通讯和linux几乎没什么两样, 要注意的是在udp接收的时候,通过netstat -an看到的
端口状态会显示为CLOSE, 这个是没有关系的!
不要被这个状况吓到。 我们就曾经在这个问题上很是纠结,结果发现端口是能正常接收的。
可以用这个示例程序:
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#ifdef ANDROID
#include <android/log.h>
#define LOGI(format,...) //__android_log_print(ANDROID_LOG_INFO ,"hello_hl","file[%s] line[%d] "format"",__FILE__, __LINE__ ,##__VA_ARGS__)
#define LOGE(format,...) __android_log_print(ANDROID_LOG_ERROR,"hello_hl","file[%s] line[%d] "format"",__FILE__, __LINE__ ,##__VA_ARGS__)
#else
#include <stdio.h>
#define LOGI(format,...) // printf("file[%s] line[%d] "format"\n",__FILE__, __LINE__ ,##__VA_ARGS__)
#define LOGE(format,...) printf("file[%s] line[%d] "format"\n",__FILE__, __LINE__ ,##__VA_ARGS__)
#endif
#define LOCAL_RECV_PORT 9414 //本机的接收端口 就是一死
your_jni_function(){ //这个是你的测试jni函数
int Recv_Sockfd;
struct sockaddr_in ser_addr;
int len_read_net;
unsigned char buffer[1024];
Recv_Sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(Recv_Sockfd <0 ){
LOGE(" open socket fail!!!");
return NULL;
}
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(LOCAL_RECV_PORT);
res = bind(Recv_Sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in));
LOGE("bind res[%u] , sin_port[%u]", res, ser_addr.sin_port);
len_read_net = recvfrom(Recv_Sockfd,buffer, sizeof(buffer), 0, (struct sockaddr*)&recv_addr, &addrlen);
//可以再这里加打印看看接收的数据
} |
|