2

私はAndroidのネイティブ部分(つまりC)にUDPクライアントを実装しました。サーバー(PC)からデータを受信するために、デバイスとPCの両方がwifi接続を介して接続されています。

クライアントがルート化されたデバイスに置かれると、サーバーからデータを完全に受信できます。ただし、ルート化されていないデバイスでは、エラーは表示されませんが、サーバーとの間でデータを送受信することはできません。

以下は私のサーバーコードです:

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{
    int cont,create_socket,new_socket,addrlen,fd;
    int bufsize = 3000;

    int nameLen=0;
    int client_address_size=0;
    char *buffer = malloc(bufsize);
    char fname[256];
    struct sockaddr_in address,client;

    if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0)
    printf("The socket was created\n");

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;

    address.sin_port = htons(15000);

    if (bind(create_socket,(struct sockaddr *)&address,sizeof(address))== 0)
        printf("Binding Socket\n");

    nameLen=sizeof(address);

    if (getsockname(create_socket,(struct sockaddr *)&address,&nameLen)<0)
    {
        printf("\n\ngetsockname() error\n");
        exit(3);
    }

    printf("Port assigned is %d\n", ntohs(address.sin_port));

    client_address_size=sizeof(client);



    if(recvfrom(create_socket,fname, 255,0,(struct sockaddr *) &client,&client_address_size)<0)
    {
        printf("\n\nrecvfrom() failed\n");
        exit(4);
    }

    printf("A request for filename %s Received..\n", fname);

    if ((fd=open(fname, O_RDONLY))<0)
    {
        perror("File Open Failed");
        exit(0);
    }

    while((cont=read(fd, buffer, bufsize))>0) 
    {
        sleep(1);
        sendto(create_socket,buffer,cont,0,(struct sockaddr *) &client,client_address_size);
        printf("\n\nPacket sent\n");
    }

    sendto(create_socket,"*",1,0,(struct sockaddr *) &client,client_address_size);

    printf("Request Completed\n");
    return close(create_socket);
}

android NDKのクライアントコード:

JNIEXPORT void JNICALL Java_com_examplemyPlayer_startClient
  (JNIEnv *env, jclass jobj, jint portNo, jstring argv1)
{
    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","start client has entered....",NULL);
    //int portno=portNo;
    const char *servIP = (*env)->GetStringUTFChars(env, argv1, 0);

    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Server IP address:%s",servIP);
    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Server Port No.:%d",portno);

    qBuff=(unsigned char *)malloc(sizeof(char)*Q_SIZE);//qBuff is a global pointer

    int create_socket,cont;
    int bytesWritten=0;
    int bufsize = 3000;
    int server_address_size=0;
    char *buffer = malloc(bufsize);

    char reqFname[8]="Bub.bin";

    struct sockaddr_in address,server;
    int serv_addr_size = sizeof(address);

    if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) < 0)
        __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","The Socket was NOT created",NULL);

    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","The Socket was successfully created",NULL);

    address.sin_family = AF_INET;
    address.sin_port = htons(15000);
    address.sin_addr.s_addr=inet_addr(servIP);

    if((sendto(create_socket, reqFname, sizeof(reqFname), 0,(struct sockaddr *) &address,sizeof(address)))==-1)
        __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Error sending filename to server",NULL);

    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Request Accepted... \n\nReceiving File...",NULL);

    server_address_size=sizeof(server);

    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Contents of the file are:",NULL);

    while((cont=recvfrom(create_socket, buffer, bufsize, 0,(struct sockaddr *) &address,&serv_addr_size))>0)
    {
            if(buffer[cont-1]=='*')
               break;

            memcpy(qBuff+r,buffer,cont);//copying received data to a circular queue
            r=(r+3000)%Q_SIZE;
            __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","Bytes received:%d",cont);
            //write(1, buffer, cont);
    }

    __android_log_print(ANDROID_LOG_DEBUG,"MYAPP","EOF",NULL);
    free(qBuff);
    close(create_socket);

}

上記のコードは、ルート化されたデバイスでは正常に機能しますが、ルート化されていないデバイスでは機能しません。私が作成しているアプリケーションは、ルート化されたデバイスとルート化されていないデバイスの両方で実行できるはずなので、ルート化されていないデバイスでもコードを実行する必要があります。

サーバーは、 / sbin / services iptable stopを使用してLinuxファイアウォールを無効にした後でのみ、ルート化されたデバイスに接続できました。したがって、通信ポートをブロックしているルート化されていないデバイス用のファイアウォールがあります。上記のコードでは、ポート番号15000を試しています。ただし、他のポートも試しましたが、うまくいきませんでした。

ですので、読者の皆様には、役立つ回答や参考リンクをお願いします。前もって感謝します。

4

0 に答える 0