问题描述
其实,我有做在Android模拟器server.c和client.c测试(PS:他们都sucesssfully运行,并与Android genric交叉编译器编译)。而,那我走的更远,我重写经由jni.But客户端,在这种情况下,客户端无法连接到服务器侧,虽然新的客户端是非常相似的client.c。
搜索后,有人提到,允许matters.But,当我加入<使用许可权的android:NAME =android.permission.INTERNET对/>
(PS :这个标签是应用标签外),仍然出现问题。
而作为logcat的节目中,Java code实际上invode的C方法,但是,何乐不为的行为一样client.c?
任何想法将有利于我,所以much.Thanks提前!
Actually,i have do a test with the server.c and client.c in the android emulator(ps:they both runs sucesssfully and are compiled with the android genric cross-compiler).And,then i go further,i rewrite the client-side via the jni.But,in this case,the client fail to connect to the server-side,though new client is very similar to the client.c.After searching,someone mentions that the permission matters.But,when i add the <uses-permission android:name="android.permission.INTERNET" />
(ps:this tags is outside the application tags),the problem still appears.And as the logcat shows,the java code actually invode the c method,but,why not it behave the same as the client.c?Any idea will benefit me so much。Thanks in advance!
在server.c:
/* Make the necessary includes and set up the variables. */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
/* Remove any old socket and create an unnamed socket for the server. */
unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket. */
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
/* Create a connection queue and wait for clients. */
listen(server_sockfd, 5);
while(1) {
char ch;
printf("server waiting\n");
/* Accept a connection. */
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,
(struct sockaddr *)&client_address, &client_len);
/* We can now read/write to client on client_sockfd. */
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}
client.c:
client.c:
/* Make the necessary includes and set up the variables. */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch = 'A';
/* Create a socket for the client. */
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* Name the socket, as agreed with the server. */
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops: client1");
exit(1);
}
/* We can now read/write via sockfd. */
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("char from server = %c\n", ch);
close(sockfd);
exit(0);
}
Java的code:
包gz.kaiwii;
java code: package gz.kaiwii;
public class NSocket {
static{
System.loadLibrary("NSocket");
}
public native void start();
}
本机code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#include <android/bitmap.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#define LOG_TAG "NSocket"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
JNIEXPORT void JNICALL Java_gz_kaiwii_NSocket_start
(JNIEnv * env, jobject object){
LOGI("JNICALL Java_gz_kaiwii_NSocket_start is called!");
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch = 'A';
/* Create a socket for the client. */
LOGI(" Create a socket for the client!");
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sockfd==-1){
LOGE("create socket error!!!!!");
}
/* Name the socket, as agreed with the server. */
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&address, len);
LOGI(" Now connect our socket to the server's socket.");
if(result == -1) {
LOGE("connect error!");
exit(1);
}
/* We can now read/write via sockfd. */
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
/*
printf("char from server = %c\n", ch);
*/
LOGI("char from server = %c\n", ch);
close(sockfd);
}
在logcat的:
the logcat:
推荐答案
如果我用抽象名字空间的名称,一切运行okay.But,有一点需要提醒的是长度!
If I use the abstract namespace as the name,everything runs okay.But,one thing should be cautioned is the length!
这篇关于通过NDK连接套接字编程错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!