2016-03-02 156 views
0

我有一個實現在大學項目中做,我不知道如何avchive它!我的問題就像標題所說的那樣,通過套接字將C++與android連接起來。通過TCP與c + +(套接字服務器)conect android(套接字客戶端)

C++必須管理至少一對套接字客戶端(android設備)或更多。 所以我儘量...

#include <iostream> 
#include<string.h> 
#include<sys/types.h> 
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<arpa/inet.h> 
#include<stdlib.h> 
#include<unistd.h> 

using namespace std; 

int main() 
{ 
    int client, server; 
    int portnum = 1500; 
    bool isExit = false; 
    int bufsize = 1024; 
    char buffer[bufsize]; 

    struct sockaddr_in server_addr; 
    socklen_t size; 

    //init socekt 

    client = socket(AF_INET, SOCK_STREAM, 0); 

    if(client < 0){ 
     cout << "Error Estableciendo la conexion" << endl; 
    } 

    cout <<"server Socket conexion creada" << endl; 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htons(INADDR_ANY); 
    server_addr.sin_port = htons(portnum); 


    //biding soket 

    if(bind(client,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0){ 
     cout << "Error Biding Socket" << endl; 
     exit(1); 
    } 

    size= sizeof(server_addr); 
    cout << "buscando clientes" << endl; 

    //escuchando sokets 

    listen(client,1); 

    //accept client 

    server = accept(client, (struct sockaddr*)&server_addr, &size); 

    if(server < 0){ 
     cout<< "Error al Aceptar" << endl; 
     exit(1); 
    } 

    while(server >0){ 
     strcpy(buffer,"server conectado---\n"); 
     send(server,buffer,bufsize,0); 

     cout <<"conectado con el cliente" << endl; 
     cout << "Ingresad # paara terminar la conexion" << endl; 

     cout <<"client: "; 
     do{ 
      recv(server,buffer,bufsize,0); 
      cout << "buffer" << " "; 
      if(*buffer == '#'){ 
       *buffer = '*'; 
       isExit=true; 
      } 
     }while(*buffer != '*'); 

     do{ 
      cout << "\n server: "; 
      do{ 
       cin >> buffer; 
       send(server,buffer,bufsize,0); 
       if(*buffer == '#'){ 
        send(server,buffer,bufsize,0); 
        *buffer = '*'; 
        isExit=true; 
       } 
      }while(*buffer != '*'); 

      cout << "Client: "; 

      do{ 
       recv(server,buffer,bufsize,0); 
       cout << buffer << " "; 
       if(*buffer == '#'){ 
        *buffer = '*'; 
        isExit = true; 
       } 
      }while(*buffer != '*'); 
     }while(isExit); 

     cout << "Conection Terminated..." << endl; 
     cout << "Goodbye..." << endl; 
     isExit =false; 
     exit(1); 
    } 
    close(client); 
    return 0; 
} 

聽每一個連接如(請如果你看到我的代碼不好邏輯讓我知道,我需要做什麼來解決它)

和Android的我做這樣的事情的,其僅用於測試的活動稱爲類...

import java.net.Socket; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class Socktest { 

    public void prueba() { 
     try { 
      Socket sock = new Socket("127.0.0.1",1234); 

      // Your Java Code Verbatim: 
      BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      String test = br.readLine(); 

      System.out.println(test); 
      sock.close(); 
     } catch (Exception ex) { 
      System.out.println(ex.getCause().toString()); 
     } 
    } 
} 

(請如果你看到不好的邏輯讓我knowit因爲我想學習更多的從自己的失敗)

和服務器進展良好,當我編譯時,它的站立,以recive新的連接,但是當一個luch的android活動,我運行「連接類」它說訪問被拒絕,我正在對linux mint工作,如果那..

我將與你coments,建議和意見gratfull。

+0

它看起來像在服務器上將portnum設置爲1500,但客戶端正試圖連接到端口1234.另外,客戶端正嘗試連接到本地主機(127.0.0.1),因此除非在相同的代碼上運行Java代碼機器作爲服務器,它不會工作 –

+0

'套接字襪子=新的套接字(「127.0.0.1」,1234);'這條線是你的問題在這裏,'127 .0.0。1'是本地環路IP,它實際上是映射到它正在運行的設備的IP地址 – Bhargav

+0

您的監聽套接字稱爲「客戶端」。它不是客戶。您正在監聽一個端口並嘗試連接另一個端口。 – EJP

回答

0

Socket sock = new Socket("127.0.0.1",1234);這條線是你的問題就在這裏,127.0.0.1是本地迴路IP,它實際上是一個IP地址映射到設備的代碼,所以你的Android客戶端從未連接到本機所在的C++代碼運行,而您需要做的是找到您的C++代碼運行的機器的IP地址,然後將127.0.0.1更改爲該IP地址。

如果你是移動終端連接到WiFi路由器到你的C++服務器連接到,那麼這個IP地址可以是本地IP地址,一切都很簡單

如果你是移動終端連接到某些移動網絡,並且您的服務器位於不同的網絡上,那麼您需要找出暴露於全球的計算機的IP地址(取決於Internet服務提供商的配置,您可能有IP地址保持靜態或IP每次連接到ISP服務器的地址都會發生變化) 你可以通過訪問http://whatismyipaddress.com/這樣的網站找到你的機器暴露的IP地址,那麼如果你的機器在路由器後面,你需要做端口轉發(在這種情況下,轉發喲你的端口1234到你的機器本地IP地址)你可以看看this guide瞭解如何做到這一點。

因此爲了避免第二步中的複雜性,我建議您使用無線路由器將您的手機和服務器連接在同一本地網絡(即您的LAN)中。

方式找到你的機器的IP地址:inet addr:後您的IP地址將是正確

在基於Linux的機器只需打開一個終端輸入ifconfig看看eth0,例如像這樣inet addr:10.99.123.23

+0

好吧,我忘了提到iam運行在android工作室的連接虛擬模擬器,使連接,我不知道是否影響任何東西?和c + + ide它的qhre我正在運行的c + +套接字服務器其Qtcreator ...他們在同一臺電腦在Linux薄荷 –

+0

@EdwinAguilar是的,這意味着他們都通過局域網協議連接,所以請與第1步 – Bhargav

+0

我嘗試過,但沒有任何作品。我的android連接到pi的wifi網絡。在Android應用程序中,套接字是這樣創建的:'Socket sock = new Socket(「pi的ip」,1500);'我沒有收到任何東西;服務器甚至沒有檢測到新的客戶端。你有什麼想法 ? – Maxouille

相關問題