Jak wysłać wiadomość do www za pomocą metody GET?

0

Cześć, siedzę na liuksie i chciałbym zrobić taki przykład, że program w C wysyła wiadomość do www która to wyświetla. JEstem początkujący więc proszę się nie śmiać.

#include<stdio.h>
#include<string.h>    //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
 
int main(int argc , char *argv[])
{
    int socket_desc;
    struct sockaddr_in server;
    char *message , server_reply[2000];
     
    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }
         
    server.sin_addr.s_addr = inet_addr("192.168.1.104");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );
 
    //Connect to remote server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }
     
    puts("Connected\n");
     
    //Send some data
    message = "GET / HTTP/1.1 name=Jak&age=20\r\n\r\n";
    if( send(socket_desc , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    puts("Data Send\n");
     
    return 0;
}

Tak wygląda program w C, który tworzy socket i wysyła message do www?
Wszystkie operacje kończy z powodzeniem.

Jak to teraz wyświetlić na www? Spłodziłem takie coś, a raczej skopiowałem.

<html>
   <body>
     <?php
   if( $_GET["name"] || $_GET["age"] ) {
      echo "Welcome ". $_GET['name']. "<br />";
      echo "You are ". $_GET['age']. " years old."
   }
?>
   </body>
</html>

Czy to ma prawo działać?
Gdy uruchomię program i odświerzę www nic się nie wyświetla. Jeszcze raz sorki za moje pytania pytanie, nie jestem programistą webowym.

1

Poczytaj, jak się ręcznie buduje zapytania HTTP, a nie zgaduj ;-)

0
GET /?name=IMIE&age=42 HTTP/1.1
0

Dzięki. Teraz wysyłam to cyklicznie, ale pod adresem 192.168.0.4 nic się nie wyświetla;(
Jak powinna wyglądać ta strona www, aby po odświeżeniu jej było widać to co wysyła program w C?

0

Generalnie, chciałbym na www wyświetlać temperature z DS18B20 i z czujnika wilgotności. Wysłaś t dwie wartości na www i wyświetlić w labelach. Mieć Kilka buttonów, np. LD_GREEN_ON, LD_GREEN_OFF, LD_RED_ON, LD_RED_OFF., po wciśnięciu przycisku wysłać jakąś ramkę a program w C zajmie się diodami.

0

Na Twoim miejscu nie bawiłbym się w komunikację z wykorzystaniem HTTP, tylko obmyślił jakiś własny protokół oparty na czystych socketach - znacznie ciekawsze, a i mniej zasobożerne ;-)

0

Tylko trzeba się na tym znać. Ja nigy nic nie rozbiłem co jest związane z web, serwerami itp. Ja nawet nie jestem programistą. Na razie wystarczy mi rozwiązanie które działa i realizuje to co napisałem wyżej.

0
Mocny Drań napisał(a):

Tylko trzeba się na tym znać. Ja nigy nic nie rozbiłem co jest związane z web, serwerami itp. Ja nawet nie jestem programistą. Na razie wystarczy mi rozwiązanie które działa i realizuje to co napisałem wyżej.

Ja bym napisał malutką aplikację we Flasku (Python), coś w stylu:

import flask

app = flask.Flask(__name__)

@app.route('/')
def hello_world():
    return str(flask.request.form)

app.run(host='0.0.0.0', port=8080, debug=True)
0

W takim razie spróbuj pobawić się z tym konceptem:

api.php

<?php

if (isset($_GET['temperature'])) {
  file_put_contents('status/temperature.txt', $_GET['temperature']);
}

index.php

<?php

$temperature = file_get_contents('status/temperature.txt');
echo sprintf('Aktualna temperatura wynosi: %s.', $temperature) . '<br>";
0

Eh, dalej nie działa. Nie jest spełniony warunek:

if (isset($_GET['temperature'])
{
}

W przeglądarkę wpisuję adres 192.168.1.104.
A wysłany message ma psotać:


Rejestracja: 4 lata temu
Ostatnio: 1 minuta temu
0
 message = "GET /?temperature=20 HTTP/1.1"

Na razie dla ułatwienia wysyłam stałą wartość. Próbowałm do message dodać też znaki teminujące "\r\n" ale to nic nie pomogło.

0

Bo potrzebujesz wysłać dwukrotnie \r\n. Przykład (w Pythonie):

>>> from socket import *
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.connect(('google.com', 80))
>>> s.send('GET /?temperature=20 HTTP/1.1\r\n\r\n'.encode('utf-8'))
>>> s.recv(1000)
b'HTTP/1.1 302 Found\r\nLocation: http://www.google.pl/?gws_rd=cr&ei=rNRwWcvOL4jM6AShl4vYCQ\r\nCache-Control: private\r\nContent-Type: text/html; charset=UTF-8\r\nP3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."\r\nDate: Thu, 20 Jul 2017 16:05:00 GMT\r\nServer: gws\r\nContent-Length: 258\r\nX-XSS-Protection: 1; mode=block\r\nX-Frame-Options: SAMEORIGIN\r\nSet-Cookie: NID=108=MSjOzM7hi34QWdOPpvvPresJrxxeBLxnS6YWnpT2jZaomdbQ9aFb8EzLHiEucftEMnLY_542H58jI0UxxP86WEAWrEOLT7IrSMB6a-8OqsbsjhO6YM5n7wDpJ9zgWyrc; expires=Fri, 19-Jan-2018 16:05:00 GMT; path=/; domain=.google.com; HttpOnly\r\n\r\n<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF="http://www.google.pl/?gws_rd=cr&amp;ei=rNRwWcvOL4jM6AShl4vYCQ">here</A>.\r\n</BODY></HTML>\r\n'
0

Podwójna terminacja nic nie zmienia.
dopiero jak wpiszę adres: ```
http://192.168.1.104/?temperature=25

To się coś wyświetli, ale to nie o to przecież chodzi.
0
<?php 
if($_GET){
	echo 'yes';
}else{ 
	echo 'no';
}
?>
0

Chyba jednak użyję Pythona i Flask. Powiedzcie mi tylko czy będę mógł "wysyłać" dane na web i parsować dane(np. stan suwaka lub switcha) z web w programie w pythonie? Flask to wszystko załatwi?

0
Mocny Drań napisał(a):

Chyba jednak użyję Pythona i Flask. Powiedzcie mi tylko czy będę mógł "wysyłać" dane na web i parsować dane(np. stan suwaka lub switcha) z web w programie w pythonie? Flask to wszystko załatwi?

Tak to z grubsza wygląda:
https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms

Oczywiście, to jest tworzenie interfejsu przeglądarkowego zaledwie.

Jeśli chodzi o zautomatyzowane pobieranie i wysyłanie informacji, za pomocą Flaska możesz zrobić proste REST api, coś w stylu /<name> wskazujące na dane <name>, które edytujesz za pomocą żądań HTTP typu POST.

0

Fajny tutorial, dzięki. Przerobię go. Jak nie bedę coś wiedział to zapytam. :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1