[英]Android NDK Networking problems: TCP Connection fails
我在使用Android NDK時遇到了一些麻煩。
我的項目需要用C編寫的軟件組件,它們可以通過TCP接收數據,以便在Android OS上執行。
為此,我使用BSD套接字在C中創建了一個簡單的服務器和客戶端,並且可以通過PC上的連接成功地來回發送消息。 現在我已將客戶端代碼移動到NDK中,無法從模擬器或實際的Android設備連接到我的服務器。 NDK編譯時沒有警告或錯誤,模擬器/電話在wifi上並且在清單中啟用了互聯網權限。 是什么賦予了?
它只是創建一個套接字,填寫主機/端口信息並嘗試連接:如果它連接,發送消息,否則返回錯誤。 Android始終為連接返回負值
PC客戶端代碼:
int tcp_socket = socket(AF_INET, SOCK_STREAM,0);
if(tcp_socket< 0 ) {
cerr << "Failed to create TCP socket." << endl;
return 2;
}
sockaddr_in server_tcp_add;
server_tcp_add.sin_family = AF_INET;
server_tcp_add.sin_port = htons(tcp_port); //set via command line: Yes, they are the same for the android
hostent *hostp = gethostbyname(server_host);
memcpy(&server_tcp_add.sin_addr, hostp->h_addr, hostp->h_length);
socklen_t slen = sizeof(server_tcp_add);
if(connect(tcp_socket,(sockaddr*)&server_tcp_add, slen) <0 ){
cerr<< "Failed to connect to server with TCP. " << endl;
close(tcp_socket);
return 3;
}
char* myString = "This is my message";
send(tcp_socket, myString, strlen(myString), 0);
close(tcp_socket);
代碼:NDK客戶端
jstring Java_networking_client_activate_initiateTcpConnection(JNIEnv* env, jobject javaThis){
int tcp_socket = socket(AF_INET, SOCK_STREAM,0);
if(tcp_socket < 0){
return (*env)->NewStringUTF(env, "ERROR CREATING SOCKET");
}
const char* server_host = "some.numbers.that.work"; //It's a valid IP I don't feel like sharing
unsigned short server_port = 43000;
struct sockaddr_in server_tcp_addr;
server_tcp_addr.sin_family = AF_INET;
server_tcp_addr.sin_port = htons(server_port);
struct hostent *hostp = gethostbyname(server_host);
memcpy(&server_tcp_addr, hostp->h_addr, hostp->h_length);
socklen_t slen = sizeof(server_tcp_addr);
if(connect(tcp_socket,(struct sockaddr*)&server_tcp_addr, slen) < 0){ //fails here
close(tcp_socket);
return (*env)->NewStringUTF(env, "ERROR CONNECTING TO SERVER");
}
char* message = "hello from android!";
send(tcp_socket, &message, sizeof(message),0);
return (*env)->NewStringUTF(env, "TCP message sent!");
}
大致相同; 需要將struct放在NDK編譯的所有內容之前。
--edit - 我還應該提一下,我已經能夠通過這個應用程序在Java上通過套接字發送數據。 只是C插座真的搞砸了。 即使是通過NDK工作的C套接字的其他人的樣本也會非常感激。
這是一個非常晚的答案,但它可能仍然有用......
我更改了這一行:
memcpy(&server_tcp_addr, hostp->h_addr, hostp->h_length);
對此:
memcpy(&server_tcp_addr.sin_addr.s_addr, hostp->h_addr, hostp->h_length);
這對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.