A
Aleks_cpp
Всем привет. Задумал проект с дистанционным управлением с телефона разными поделками на миниПК. Начиналось всё с ардуино в далёком прошлом. И теперь загорелся интересом собрать полноценный "умный дом". В программировании я не очень силён, тем более в java, но основы на C++ кое какие есть. Хорошие знакомые подсказали держать путь в сторону сокетов. перечитал немало статей, ну и тут как у нормального новичка возникают вопросы разного характера, ответы на которые не везде раскрываются. Поэтому прошу знающих людей ответить или подсказать советом.
Вопросы:
1. Совместимы ли сокеты на языках C++ & java?
2.Возможна ли вообще такая реализация? какие подводные камни?
3. какие последствия реализации на разных платформах, на java? и как это можно обойти?
В целом на сегодняшний день написан простенький клиент на яве под андроид, и тестовый сервер на C++ под Armbian установленную на мини пк. При подключении сервер выдаёт ошибку неправильного ip адреса клиента.
тут сервер:
тут клиент:
Вопросы:
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();
} ;
}
});
}
});