2016-03-02 6 views
0

У меня есть реализация, которую нужно выполнить в проекте колледжа, и я не знаю, как ее открыть !. моя проблема, как и название, разрешить андроид с помощью C++ через сокеты.conect android (сокет-клиент) с C++ (сокет-сервер) через TCP

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; 
} 

слушать каждую СВЯЗЬ (пожалуйста, если вы видите плохую логику в моем коде, дайте мне знать это и то, что мне нужно сделать, чтобы исправить это)

и в андроиде I сделать что-то вроде этого в классе, что его названия от деятельности только для тестирования ...

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, потому что я хочу, чтобы узнать больше из моих неудач)

, и сервер идет хорошо, когда я скомпилирован, его стоял, чтобы получить новый коннект, но когда я наблюдаю активность андроида, и я запускаю «класс conection», он говорит, что доступ запрещен, я работаю над linux mint, если этот afect ..

Я буду благодарен вам за советы, предложения и советы.

+0

Похоже, у вас есть portnum, установленный на сервере 1500, но клиент пытается подключиться к порту 1234. Кроме того, клиент пытается подключиться к localhost (127.0.0.1), поэтому, если Java-код не работает на одном и том же машина как сервер, она не будет работать –

+0

'Socket sock = new Socket (" 127.0.0.1 ", 1234);' эта строка является вашей проблемой прямо здесь, '127 .0.0.1 - это локальная петля IP, ее фактический IP-адрес, который сопоставляется с устройством, которое выполняется на – Bhargav

+0

. Ваш прослушивающий сокет называется 'client'. Это не клиент. Вы слушаете один порт и пытаетесь подключиться к другому. – EJP

ответ

0

Socket sock = new Socket("127.0.0.1",1234); Эта строка является вашей проблемой прямо здесь, 127.0.0.1 - это локальный IP-адрес, на самом деле это IP-адрес, который сопоставляется с устройством, код которого включен, поэтому ваш клиент android никогда не подключается к машине, где код C++ вместо этого вам нужно найти IP-адрес компьютера, на котором работает ваш код C++, а затем измените 127.0.0.1 на этот IP-адрес.

Если вы мобильный подключен к Wi-Fi маршрутизатора, к которому ваш сервер с ++ подключен к, то этот IP-адрес будет локальный IP-адрес, и все просто

Если вы мобильный подключен в какую-либо мобильную сеть, а ваш сервер находится в другой сети, вам нужно узнать IP-адрес вашего компьютера, доступного миру (в зависимости от конфигурации поставщиков услуг Интернета у вас может быть статический IP-адрес или IP-адрес адрес, который изменяется каждый раз, когда ваше соединение с сервером ISP сбрасывается). . Вы можете найти свои компьютеры с открытым IP-адресом, перейдя на веб-сайты, такие как http://whatismyipaddress.com/, а затем, если ваш компьютер находится за маршрутизатором, вам необходимо выполнить переадресацию портов (в этом случае вперед ur port 1234 на ваш локальный IP-адрес вашего компьютера), вы можете посмотреть this guide, чтобы понять, как это сделать.

Чтобы избежать сложностей на втором этапе, я советую вам подключить свой мобильный и ваш сервер в той же локальной сети (то есть к вашей локальной сети) с помощью Wi-Fi-маршрутизатора.

Пути, чтобы найти IP-адрес устройства:

В машинах на базе Линукс просто открыть терминал и введите ifconfig и посмотреть на eth0 ваш IP-адрес будет сразу после inet addr:, например, как это inet addr:10.99.123.23

+0

Хорошо, я забыл упомянуть, что iam запускает виртуальный эмулятор связи, который находится в студии android, чтобы сделать коннект, я не знаю, влияет ли это во что угодно? и C++ ide его qhre я запускаю сервер сокета C++ своим Qtcreator ... оба из них в одном компьютере в linux mint –

+0

@EdwinAguilar да, что означает, что оба они подключены по протоколу LAN, поэтому переходите к шагу 1 – Bhargav

+0

I пробовал это, но ничего не работает. Мой андроид подключен к Wi-Fi-сети пи. В приложении Android сокет создается следующим образом: «Socket sock = new Socket (« ip of pi », 1500);« и я ничего не получаю; Сервер даже не обнаруживает нового клиента. У тебя есть идеи ? – Maxouille

Смежные вопросы