2016-03-02 207 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

相关问题