• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

совместимость Socket сервер на С++ и Socket клиент на Android

A

Aleks_cpp

Всем привет. Задумал проект с дистанционным управлением с телефона разными поделками на миниПК. Начиналось всё с ардуино в далёком прошлом. И теперь загорелся интересом собрать полноценный "умный дом". В программировании я не очень силён, тем более в java, но основы на C++ кое какие есть. Хорошие знакомые подсказали держать путь в сторону сокетов. перечитал немало статей, ну и тут как у нормального новичка возникают вопросы разного характера, ответы на которые не везде раскрываются. Поэтому прошу знающих людей ответить или подсказать советом.
Вопросы:
1. Совместимы ли сокеты на языках C++ & java?
2.Возможна ли вообще такая реализация? какие подводные камни?
3. какие последствия реализации на разных платформах, на java? и как это можно обойти?

В целом на сегодняшний день написан простенький клиент на яве под андроид, и тестовый сервер на C++ под Armbian установленную на мини пк. При подключении сервер выдаёт ошибку неправильного ip адреса клиента.
тут сервер:
C++:
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <netinet/in.h>
# include <sys/types.h>
# include <arpa/inet.h>
# include <string.h>
# include <unistd.h>

using namespace std; //порт для связи
const unsigned int port = 1100; //буфер для получения данных
char buf[512];
/* задачи программы создать сервер (простой TCP) слушать по$
(пака локальный) входящий выводить все данные на экран, !!!!в дальнейшем
опрашивать состояние портов и отсылать по запросу */
int main(){
        printf("%s/", "Запуск сокета: \n");
        struct sockaddr_in stSockAddr;
        stSockAddr.sin_family = PF_INET; //
        stSockAddr.sin_port = htons (port); //непомешала бы проверка разрядности системы
        stSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY все адра локального хоста (0.0.0.0);

        //создаём объект и присваеваем его дескриптор для дальнейшей работы
        int mySocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (mySocket == -1) {
                perror("Error Socket ");
                exit(EXIT_FAILURE);
        } else { printf("%s/", " Socket run .");
}       //назначение имени, привязывание сокета к нашим данным (порту и адресу)
        if(bind(mySocket, (struct sockaddr*) &stSockAddr, sizeof
(stSockAddr))== -1){
                perror("Eror Bind func. ");
                printf("%s/", "Error Bind func.");
                close(mySocket);
                exit(EXIT_FAILURE);
        }

        if (listen(mySocket, 10) == -1) {
                printf("%s/", "Error listen func.");
                perror("Error listen");
                                close(mySocket);
                exit(EXIT_FAILURE);
        }

        for (;;) {
                printf("%s/" "%d/", "for...."  htonl(stSockAddr.sin_addr.s_addr));

        struct  sockaddr_in client_addr; //структура данных слиента
      int cl_size = sizeof(client_addr);
      int socConnectFD = accept(mySocket,(struct sockaddr*) &client_addr, (socklen_t*)cl_size);
       if (socConnectFD < 0) {
                        perror("Ошибка: принятия");
                        close(socConnectFD);
                        exit(EXIT_FAILURE);
                }
                //выводим адрес клиента
                printf ("%d/", ntohs(client_addr.sin_addr.s_addr));
                //считываем данные с порта
                read(socConnectFD, buf, sizeof(buf));
                //выводим их на экран
               printf( buf);
                /* выполнение операций чтения и записи ... */
               
                //закрытие
                shutdown(socConnectFD, SHUT_RDWR);
                close(socConnectFD);
        }
        return 0;

}

тут клиент:
Java:
public class MainActivity extends AppCompatActivity {

    Button button1;
    Button button2;
    String IP;
    EditText text;
    EditText masseg;
    private PrintWriter mBufferOut;
    private BufferedReader mBufferIn;
    LaptopServer lts = new LaptopServer();
    String str;

    private String address;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       // new Thread(new ClientThread()).start();
        button1 = (Button) findViewById(R.id.sendButton);
        button2 = (Button) findViewById(R.id.sendMasege);
        text= (EditText) findViewById(R.id.textView);
        masseg = (EditText) findViewById(R.id.text2);
        button1.setText("open");
        button2.setText("send");

     
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               IP = text.getText().toString();
                if(IP == null || IP.length()<10) {
                    Toast.makeText(getApplicationContext(), " нужен IP сервера", Toast.LENGTH_SHORT).show();
                }
                //если сервер не подключен то подключаем его
                //иначе если есть подключение то закрываем его
                 if(!lts.chekServer()){
                    Toast.makeText(getApplicationContext(), "Подключаемся к "+ IP, Toast.LENGTH_SHORT).show();
                    //передаём ip сервера
                    lts.getDt(IP);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try{
                                lts.openConection();
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {

                                        button1.setText("Close");
                                    }
                                });

                            }

                            catch (Exception e){
                                Log.e(str, e.getMessage());
                                lts = null;
                            }
                        }
                    }).start();

                }
                //закрываем подключение
                else {
                    lts.closeConection();
                    lts = null;
                }

            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //преобразовываем строку
                str = new String( masseg.getText().toString());
                //отправку данных нужно реализовать в отдельном потоке
                if (lts == null ){
                    Log.e("\n Ошибка ","Сервер не найден");
                }
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                   try{
                       //оправляем данные
                       lts.sendData(str);
                   } catch (Exception e) {
                       e.printStackTrace();
                   } ;
                    }
                });


            }

        });
 

c0mb0

Green Team
02.10.2018
52
19
BIT
13
эм... ну и вопросы у тебя... Да совместимы, почему бы и нет. Сервер и клиент в одной сети? я так понимаю без проброса портов на роутере, файрвол и прочее, так просто не постучать к серверу, зачем соккеты все время держать, если можно веб сервер и слать POST/GET запросы, так-же для управления можно использовать Firebase Cloud Messaging или управлять через telegram например
 
A

Aleks_cpp

В пробросе пака нет нужды, всё делается в домашних условиях в локалке. И к серверу подключение есть. после подключения выходит ошибка
ICODE]
Ошибка: принятия: Bad address

[/ICODE]
А POST/GET намеренно не использую, честно уже не помню причины.
 
A

Aleks_cpp

В общем сам разобрался с вопросом
1. Совместимы ли сокеты на языках C++ & java?
просто собрал пример из интернета Server на java,
и заколотился с телефона без проблем с первого раза!
Вывод: на разных языках и платформах структуры данных сокетов отличаются.
 
A

Aleks_cpp

Ну чтож..... Сам спросил, сам ответил, после долгих скитаний по интернету и долгих разборов примеров, я собрал таки сервер на С++ и клиент на андроиде. (кстати нааборот тоже собирал) И вот результат...
1. Совместимы ли сокеты на языках C++ & java?
Да совместимы, по крайней мере на уровне домашней сети.(локалки) Нет разницы хоть сервер на java хоть на с++, они оба взаимодействуют с любым устройством где организован клиент на socket(С++/java||windows/linux/android).
В java клиенте я наткнулся на проблему передачи простой строки типа string в метод отправки сообщения серверу (перевод в байтовый массив). выручила функция data.getBytes(Charset.defaultCharset()), где data объект класса string.
думаю столкнусь ещё не с одной проблемой, если есть у кого предложения буду рад обсудить. если есть вопросы, буду рад ответить.
Работа продолжается...
 
  • Нравится
Реакции: Сергей Попов

simon_

New member
14.09.2022
1
0
BIT
2
Ну чтож..... Сам спросил, сам ответил, после долгих скитаний по интернету и долгих разборов примеров, я собрал таки сервер на С++ и клиент на андроиде. (кстати нааборот тоже собирал) И вот результат...

Да совместимы, по крайней мере на уровне домашней сети.(локалки) Нет разницы хоть сервер на java хоть на с++, они оба взаимодействуют с любым устройством где организован клиент на socket(С++/java||windows/linux/android).
В java клиенте я наткнулся на проблему передачи простой строки типа string в метод отправки сообщения серверу (перевод в байтовый массив). выручила функция data.getBytes(Charset.defaultCharset()), где data объект класса string.
думаю столкнусь ещё не с одной проблемой, если есть у кого предложения буду рад обсудить. если есть вопросы, буду рад ответить.
Работа продолжается...
Ну и как продвигается?
Самому нужна серверная часть. Пока руки не дошли, с железной почти закончил. Предлагаю обменяться инфой, а может и объединиться чтобы закончить проект. Напишите в личку, ваш профиль не открывается.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!