簡體   English   中英

通過TCP與android(socket客戶端)和c ++(socket服務器)連接

[英]conect android(socket client) with c++(socket server) via TCP

我有一個大學項目要做的實現,我不知道該怎么做! 我的問題就好像標題說的那樣,通過套接字用c ++連接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());
        }
    }
}

(請讓我知道錯誤的邏輯,因為我想從失敗中學習更多)

當我編譯服務器時,服務器運行良好,等待新的連接,但是當出現android活動並運行“連接類”時,它說訪問被拒絕,如果那樣的話,我正在Linux Mint上工作...

我將對您的評論,建議和意見感到滿意。

Socket sock = new Socket("127.0.0.1",1234); 這行是您的問題所在, 127.0.0.1是本地循環IP,它實際上是一個IP地址,該IP地址映射到代碼所在的設備,因此您的android客戶端永遠不會連接到運行c ++代碼的計算機,您需要做的是找到正在運行c ++代碼的計算機的IP地址,然后將127.0.0.1更改為該IP地址。

如果您的手機已連接到與c ++服務器相連的wifi路由器,則此IP地址將是本地IP地址,一切都很簡單

如果您的移動設備已連接到某個移動網絡,並且您的服務器位於其他網絡上,則需要找出暴露給外界的計算機的IP地址(取決於Internet服務提供商的配置,您可能擁有IP地址保持靜態,或者IP地址在每次與ISP服務器的連接每次重置時都會更改)。您可以通過訪問http://whatismyipaddress.com/等網站來查找計算機的IP地址,如果您的計算機位於路由器后面, ,您需要進行端口轉發(在這種情況下,將端口1234轉發到計算機的本地IP地址),您可以查看本指南以了解如何執行此操作。

因此,為避免第二步的復雜性,我建議您使用wifi路由器將移動設備和服務器連接到同一局域網(即LAN)中。

查找機器IP地址的方法:

在基於Linux的計算機上,只需打開一個終端並輸入ifconfig並查看eth0您的IP地址將在inet addr: ,例如這樣的inet addr:10.99.123.23

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM