Socket TCP Trasferimento dati da PC a dispositivo Android (Android NDK)

Sto lavorando per implementare la socket TCP tra il dispositivo Android (client) e il PC (server), il codice implementato da c ++ (Android NDK).

each cosa che funziona bene, quando faccio eseguire sul lato server l'output " server inizia " in attesa di connettersi al client. e l'altro lato quando faccio eseguire per il client funziona quando fino alla connessione al server e trovo questo errore " socket connect to error server "

  • Multi app flavor basata sulla libreria multi flavor in Android Gradle
  • Come si può tirare i dati (privati) della propria applicazione Android?
  • Errore di installazione: INSTALL_FAILED_MEDIA_UNAVAILABLE?
  • TextInputLayout: Colore diverso per l'etichetta di suggerimento quando non focalizzato
  • Portale captivo sul dispositivo android
  • Versione degli oggetti in firebase
  • qualcuno può dirmi che il desiderio è il problema?

    l'idea che voglio trasferire la matrix 16 * 16 dal server al client e formare il client al server …

    lato server:

    MyServerThread::MyServerThread() { startServer(); } void MyServerThread::run() { //std::cout<<"hi"<<std::endl; for(int i=0;i<16;i++) matrix[i]=(float)i; memcpy(buf,matrix,4*16); sendMSG(); } //TCP socket /* now create the server socket make it an IPV4 socket (PF_INET) and stream socket (TCP) and 0 to select default protocol type */ if ( (server_skt = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ std::cerr<<"socket creation failed"<<std::endl; exit(1); } //Initail, bind to port /* now fill in values of the server sockaddr_in struct s_addr and sin_port are in Network Byte Order (Big Endian) Since Intel CPUs use Host Byte Order (Little Endian), conversion is necessary (eg htons(), and htonl() */ server_addr.sin_family = AF_INET;//IPv4 server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); memset(server_addr.sin_zero, 0, 8); //binding /* now bind server port associate socket (server) with IP address:port (server_addr) */ if ( bind(server_skt, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1 ){ std::cerr<<"socket bind failed"<<std::endl; exit(1); } int queueSize=1; //Start listening, wait for connection from client with a pending queue of size if ( listen(server_skt, queueSize) == -1 ){ std::cerr<<"socket listen failed"<<std::endl; exit(1); } //Wait for connect! bool gotClient=false; while(!gotClient){ sin_size = sizeof(struct sockaddr_in); socklen_t temp=sin_size; std::cout<<"server starts"<<std::endl; if ( (client_skt = accept(server_skt, (struct sockaddr*)&clients_addr, &temp)) == -1 ){ std::cerr<<"socket error"<<std::endl;} else { gotClient=true; std::cout<<"Got client"<<std::endl; } } void MyServerThread::sendMSG() { if ( (numbytes = send(client_skt, buf, strlen(buf),0)) == -1){ std::cerr<<"server, normal send error"<<std::endl; exit(1); } } void MyServerThread::recvMSG() { if ( (numbytes = recv(client_skt, buf, bufferSize,0)) == -1 ){ std::cerr<<"server, normal recv error"<<std::endl; exit(1); } } 

    Dalla parte del cliente:

     Client::Client() { } void Client::startClient() { /* now fill in sockaddr_in for remote address */ serv_addr.sin_family = AF_INET; /* save the server IP (input from Java */ serv_addr.sin_addr.s_addr = inet_addr(serverIP); /* set port */ serv_addr.sin_port = htons(PORT); memset(serv_addr.sin_zero, 0, 8); /* create local stream socket */ client_skt = socket(PF_INET, SOCK_STREAM, 0); if (client_skt < 0) { __android_log_print(ANDROID_LOG_ERROR,"jni client","socket creation error"); exit(-1); } /* bind local socket to any port number */ local_addr.sin_family = AF_INET; local_addr.sin_addr.s_addr = htonl(INADDR_ANY); //local_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); local_addr.sin_port = htons(PORT); memset(local_addr.sin_zero, 0, 8); rc = bind(client_skt, (struct sockaddr *) &local_addr, sizeof(local_addr)); if (rc < 0) { __android_log_print(ANDROID_LOG_ERROR,"jni client","socket bind error"); exit(1); } __android_log_print(ANDROID_LOG_INFO,"jni client","client start finished"); } void Client::connectServer() { __android_log_print(ANDROID_LOG_INFO,"jni client","connect to server starts"); /* connect to server */ rc = connect(client_skt, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (rc < 0) { __android_log_print(ANDROID_LOG_ERROR,"jni client","socket connect to server error"); exit(1); } __android_log_print(ANDROID_LOG_ERROR,"jni client","server connected"); } void Client::sendMSG() { if ( (numbytes = send(client_skt, "hello!", strlen("hello!"),0) )== -1 ){ __android_log_print(ANDROID_LOG_ERROR,"jni client","send error"); //exit(1); } } void Client::recvMSG() { if ( (numbytes = recv(client_skt, buf, bufferSize,0) ) == -1 ){ __android_log_print(ANDROID_LOG_ERROR,"jni client","recv error"); //exit(1); } else { memcpy (matrix, buf, numbytes); for(int i=0;i<4;i++) __android_log_print(ANDROID_LOG_INFO,"matrix","%f, %f, %f, %f",matrix[i*4],matrix[i*4+1],matrix[i*4+2],matrix[i*4+3]); } } 

    Saluti,

  • Mostra la visualizzazione vuota quando ListView è vuoto
  • Autorizzazioni per l'inserimento di applicazioni Android tramite adb
  • Come impostare l'opacità (Alpha) per la visualizzazione in Android
  • Android: Come modificare la frequenza di riproduzione di musica utilizzando OpenSL ES
  • Pulsante AppCompatPreferenceActivity non funziona
  • come submit dal path di onactivityresult uri ad un'altra attività e modificarlo all'image
  • One Solution collect form web for “Socket TCP Trasferimento dati da PC a dispositivo Android (Android NDK)”

    Se il client e il server si trovano nella stessa macchina, la connect() potrebbe non riuscire con EADDRINUSE (l'indirizzo locale è già in uso) perché si sta legando sia il client che il server allo stesso numero di port:

     local_addr.sin_port = htons(PORT); 

    Modificare il codice client, associando il client alla port 0 (il che significa che il kernel selezionerà una port effimera non utilizzata) e riprovare.

    Anche se questo non è il problema esatto che hai, devi sempre registrare l'errore restituito dalle funzioni della libreria. Dopo che la connect() non riesce, registrare il valore di strerror(errno) .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.