Мой код сокета на стороне клиента C ++ собирает только самую первую строку вывода, предоставленную сервером сокетов Arduino (я думаю, я могу это так назвать).Подскажите, пожалуйста, где я ошибаюсь с моим C ++ кодом и как это исправить?Если вопрос слишком подробный, перейдите к коду C ++ внизу.
Настройка оборудования : Arduino Mega с картой Ethernet (щит) и Intel NUC с Ubuntu 16.04.Два устройства соединены с помощью кабеля и неуправляемого коммутатора.
Сторона Arduino : я начал с примера веб-сервераиз библиотеки Arduino Ethernet и изменял код, пока я не смог собрать состояние всех операций ввода-вывода, обработать данные ввода-вывода и сделать результаты доступными для веб-клиента.На изображении ниже показан снимок HTML-кода с тарелками my Arduino.
Код Arduino, который обрабатывает серверную часть сокетов, выглядит следующим образом (все работает, но предполагается, что он показывает все):
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xBA, 0xDA, 0x55, 0x12, 0x34, 0x56};
IPAddress ip(192, 168, 0, 21);
EthernetServer server(80);
void setup()
{
Ethernet.begin(mac, ip);
// Check for Ethernet hardware present
if (Ethernet.hardwareStatus() == EthernetNoHardware)
{
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware.");
while (true)
{
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF)
{
Serial.println("Ethernet cable is not connected.");
}
server.begin();
}
void loop()
{
//true when there is an incoming connection
if (client)
{
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
//the next two lines print the client HTTP GET request to serial.
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 1");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
//whole bunch of client.println("...."); to dish out a web page.
client.println("</html>");
break;
}
if (c == '\n')
{
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r')
{
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
//delay(1);
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
Intel NUC с Ubuntu 16.04 и C ++ 11 : я следовал учебному пособию (https://www.binarytides.com/socket-programming-c-linux-tutorial/), чтобы выяснить сторону клиента сокета и изучил C ++ из https://www.learncpp.com. ИтакПока я могу отправить запрос на сервер Google и собрать HTML-страницу, используя мой сокет, и распечатать HTML-код в терминал:
Вот мой код C ++:
#include <iostream> //for std::cout & std::endl
#include<arpa/inet.h> //inet_addr
#include<string.h> // for strlen
int main()
{
int my_socket = socket(AF_INET , SOCK_STREAM , 0);
//make sure the socket we got is OK
if (my_socket == -1)
{
std::cout << "problem creating a socket." << std::endl;
}
struct sockaddr_in connectionToServer;
connectionToServer.sin_addr.s_addr = inet_addr("172.217.2.99");//google IP
connectionToServer.sin_family = AF_INET; //type of IP addres. where AF_INET is IPv4
connectionToServer.sin_port = htons(80); //port is set via a method
if (connect(my_socket , (struct sockaddr *)&connectionToServer , sizeof(connectionToServer)) < 0)
{
std::cout << "connect error" << std::endl;
return 1;
}
std::cout << "Connected" << std::endl;
//send a request to get a page
char *message = "GET / HTTP/1.1\r\n\r\n";
if( send(my_socket , message , strlen(message) , 0) < 0)
{
std::cout << "Send failed" << std::endl;
return 1;
}
std::cout << "Data Sent\n" << std::endl;
char buffer [20000] = {};
if( recv(my_socket, buffer , sizeof(buffer) , 0) < 0)
{
std::cout << "recv failed" << std::endl;
}
for(int i=0; i<20000 ; i++)
{
std::cout<< buffer[i];
}
return 0;
}
Проблема : когда я меняю IP-адрес с Google на Arduino в моей программе на C ++, клиентская программа сокета cpp собирает только самую первую строку, которую выводит сервер сокетов ArduinoЯ знаю, что это самая первая строка, так как я изменил первую строку, которую сервирует сервер Arduino, добавив «... но это не имеет значения», и изменение обнаружилось в стандартном окне вывода программы c ++. Мне нужноC ++ программа для сборавесь вывод, а не только первая строка.что касается меня, я не могу понять, как.
Не могли бы вы помочь мне со следующими вопросами:
- Как мне собрать все сообщение Arduino (а не только первую строку)?Какую модификацию мне нужно сделать с моей программой на C ++?Система должна иметь возможность передавать данные с одного устройства на другое.
- Вся цель этой установки - передать 2 числа с плавающей запятой и 6 целых чисел из Arduino в мою программу на C ++.Очень скоро я собираюсь покончить со всем HTML.Какой протокол вы бы порекомендовали использовать при передаче данных?Я думал о заполнении каждого значения буквами.Пример: «Aint1A Bint2B Cint3C Dfloat1D ...» и так далее.Можете ли вы порекомендовать какой-нибудь пост / учебник / веб-страницу, предлагающую лучший способ упаковки и обработки данных, поступающих в программу на C ++ через сокет?
Заранее извиняюсь за исправлениевопрос Codez, но все вопросы, которые я прочитал, слишком сложны для меня, поскольку они касаются переполнения буфера, безопасности, порядковых номеров, обработки ошибок, искаженных сообщений и т. д., что выходит далеко за рамки моих потребностей (возможно, способность более точна)).Большое спасибо за ваше время и помощь.