Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wysyłanie form post w C. Program ma działać na MMnet 1002.

wawer_rz 04 May 2011 13:25 4520 59
SterControl
  • #1
    wawer_rz
    Level 10  
    Witam,
    mam mianowicie problem z przesyłaniem danych za pomocą formularza:
    Wysyłanie form post w C. Program ma działać na MMnet 1002.
    Formularz wygląda następująco:
    Code: html4strict
    Log in, to see the code


    Teraz to, co się wpisuje i wysyła ma być uzupełniane i wysyłane. Program, który pisze jest w C, niestety C# i C++ nie wchodzi w grę - kompilator dostarczony przez propox nie obsługuje innego języka. Program ma działać na MMnet 1002. Próbowałem już libcurl, ale powyższy kompilator nie ma tych bibliotek.
  • SterControl
  • #2
    syslawek
    Level 14  
    Zainteresuj się klasą WebClient z System.Net - ma wszystko, czego potrzebujesz.

    Szczegóły tutaj
  • #3
    wawer_rz
    Level 10  
    Dzięki za pomoc. Niestety MMnet1002 pracuje na linux-sie. Więc program musi być pod tę platformę. Jeszcze doszło kolejne utrudnienie formularz jest zabezpieczony https... MOże ktoś wie jak to zrobić np w Javie której nie znam a chętnie się nauczę. I jak tą javę podłączyć do głównego programu pisanego w C? Java by tylko i wyłącznie wysyłała dane.
  • SterControl
  • #4
    syslawek
    Level 14  
    A jakiego kompilatora (środowiska) używasz? Jeśli to jest mono, to tam klasa WebClient jest zaimplementowana w dokładnie taki sam sposób jak w C# MS.

    Spróbuj skompilować coś takiego:

    Code: csharp
    Log in, to see the code


    U mnie pod mono kompiluje się bez problemów (i bez problemów uruchamia).
  • #5
    fantom
    Level 31  
    syslawek wrote:
    Zainteresuj się klasą WebClient z System.Net - ma wszystko, czego potrzebujesz.

    Szczegóły tutaj


    A ktorego slowa nie zrozumiales ? To ma byc w C a nie w .NETowych bzdetach.

    wawer_rz wrote:
    Próbowałem już libcurl ale powyższy kompilator nie ma tych bibliotek.

    Co znaczy "kompilator nie ma bibliotek" ? Zaden kompilator nie ma bibliotek (no moze poza libc, libm i ewentualnie kilkoma innymi niezbednymi). Biblioteki dolacza sie (lub pokazuje ktore maja byc ladowane dynamicznie w procesie uruchamiania) podczas linkowania programu. Dodatkowo w tej stronie wskazujesz na jakiegos JSP a to oznacza ze musialbys rowniez to JSP obsluzyc. Czy jestes 100% pewien co tak naprawde chcesz zrobic ?
  • #6
    syslawek
    Level 14  
    Masz rację - niedostatek przecinków w pierwszym poście wawer_rz sprawił, że źle zrozumiałem jego problem.
  • #7
    wawer_rz
    Level 10  
    fantom wrote:

    Co znaczy "kompilator nie ma bibliotek" ? Zaden kompilator nie ma bibliotek (no moze poza libc, libm i ewentualnie kilkoma innymi niezbednymi). Biblioteki dolacza sie (lub pokazuje ktore maja byc ladowane dynamicznie w procesie uruchamiania) podczas linkowania programu. Dodatkowo w tej stronie wskazujesz na jakiegos JSP a to oznacza ze musialbys rowniez to JSP obsluzyc. Czy jestes 100% pewien co tak naprawde chcesz zrobic ?


    Faktycznie źle określiłem.

    Program czytający porty I/O, ma wysyłać za pomocą formularza odpowiednie dane przy odpowiednim sygnale na porcie wejścia. Program jest uruchomiony na płytce propoxsu MMnet1002. Używam do kompilacji OpenWrt-SDK-at91-for-Linux-i686. I tam właśnie nie wiem gdzie dołączyć te biblioteki. Program musi wykonywać to co robi człowiek tzn. wpisywać dane do formularza i wysyłać za pomocą skryptu javy do którego nie mam dostępu ... Dane w formularzu mają postać xml:
    Code: xml
    Log in, to see the code
  • #8
    fantom
    Level 31  
    To ja moze sprobuje jeszcze uscislic. Ty nie chcesz wyslac formularza tylko odpowiedz na formularz za pomoca metody POST. Jesli formularz zawsze bedzie ten sam to nie musisz tego html-a analizowac tylko wyslac POST-a "na chama" konstruujac stalego stringa i dodajac na koncu tylko odpowiedni Content. Zesnifuj sobie odpowiedz za pomoca wiresharka z jakiegos PC-ta, skopiuj sobie to do stringa w aplikacji i na koncu doklejaj tylko content podczas wysylania. Nie potrzeba do tego zadnych specjalistycznych bibliotek.
  • #9
    wawer_rz
    Level 10  
    fantom wrote:
    To ja moze sprobuje jeszcze uscislic. Ty nie chcesz wyslac formularza tylko odpowiedz na formularz za pomoca metody POST. Jesli formularz zawsze bedzie ten sam to nie musisz tego html-a analizowac tylko wyslac POST-a "na chama" konstruujac stalego stringa i dodajac na koncu tylko odpowiedni Content. Zesnifuj sobie odpowiedz za pomoca wiresharka z jakiegos PC-ta, skopiuj sobie to do stringa w aplikacji i na koncu doklejaj tylko content podczas wysylania. Nie potrzeba do tego zadnych specjalistycznych bibliotek.


    Ok. Dobra zesnifowałem tylko moje pytanie jak z tych danych wywnioskować, co zostało zmienione, aby zmieniać Content? Jak możesz podać jakieś źródła (co mogę poczytać) aby to zrobić.
  • #10
    fantom
    Level 31  
    wawer_rz wrote:
    fantom wrote:
    To ja moze sprobuje jeszcze uscislic. Ty nie chcesz wyslac formularza tylko odpowiedz na formularz za pomoca metody POST. Jesli formularz zawsze bedzie ten sam to nie musisz tego html-a analizowac tylko wyslac POST-a "na chama" konstruujac stalego stringa i dodajac na koncu tylko odpowiedni Content. Zesnifuj sobie odpowiedz za pomoca wiresharka z jakiegos PC-ta, skopiuj sobie to do stringa w aplikacji i na koncu doklejaj tylko content podczas wysylania. Nie potrzeba do tego zadnych specjalistycznych bibliotek.


    Ok. Dobra zesnifowałem tylko moje pytanie jak z tych danych wywnioskować, co zostało zmienione, aby zmieniać Content? Jak możesz podać jakieś źródła (co mogę poczytać) aby to zrobić.


    Pokaz co dostales. Generalnie to powinno wygladac mniej wiecej tak:

    To jest twoj staly string
    POST /page/ProductionInterface.jsp HTTP/1.1
    Host: www.costam.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: pl,en-us;q=0.7,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://www.costam.com/page/simple-form.html
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 64
    To jest twoj content
    message=<PRREQUEST><RESTATECH><SITE>P9034</SITE><RES>KPT</RES<NEWSTATE>1</NEWSTATE><USER>SCANBUS</USER><ACTIVITY>XML</ACTIVITY><DATE_TIME></DATE_TIME></RESTATECH></PRREQUEST>
  • #11
    wawer_rz
    Level 10  
    Nie wiem może coś źle robię :/. Jak dostać tego typu dane? Formularz idzie po https -ie.
  • #12
    fantom
    Level 31  
    wawer_rz wrote:
    Nie wiem może coś źle robię :/. Jak dostać tego typu dane? Formularz idzie po https -ie.


    Jesli uzywasz wiresharka-a to zastosuj filtr "https" w oknie Filter:.

    EDIT: Filtr https nie dziala ale http poprawnie zbiera rowniez https-a.
  • #13
    wawer_rz
    Level 10  
    Dostaję coś takiego:
    NOTIFY * HTTP/1.1
    
    HOST: 239.255.255.250:1900
    
    CACHE-CONTROL: max-age=1800
    
    LOCATION: http://161.87.69.52:8794/desc1.xml
    
    NT: urn:schemas-upnp-org:service:Power:1
    
    NTS: ssdp:alive
    
    SERVER: Cellvision UPnP/1.0
    
    USN: uuid:340804964F29-0::urn:schemas-upnp-org:service:Power:1

    Biorę formularz i wysyłam i mam coś takiego właśnie.
  • #14
    fantom
    Level 31  
    Masz wziac formularz za pomoca GET a nastepnie wyslac odpowiedz na formularz za pomoca POST. NOTIFY tu nie ma zadnego znaczenia. Pytanie czy twoje dane dochodza do serwera i czy sa prawidlowo analizowane. Serwer na prawidlowo wyslanego POST-a powinien zwrocic 200 OK z informacja zwrotna (lub bez).
  • #15
    wawer_rz
    Level 10  
    Nadal walczę z wysyłaniem. Okazało się że mam wysyłać po prostu XML-a na podanego linka do javy(adres url). Tylko teraz pytanie jak to zrobić szukam na necie(google) znalazłem libcurl niestety nie wiem jak wysyłać dane. Czy ktoś wie gdzie mogę znaleźć interesujące mnie informacje?
  • #16
    fantom
    Level 31  
    No masz wysylac po prostu XML-a ale musisz go opakowac w jakiegos prawidlowo skonstruowanego POST-a bo po drugiej stronie stoi Servlet ktory akceptuje tylko prawidlowe komunikaty HTTP.
  • #17
    wawer_rz
    Level 10  
    Masz może jakieś linki do bibliotek? Bo już od dłuższego czasu szukam i nie mogę znaleźć odpowiedniego przykładu.
  • Helpful post
    #18
    fantom
    Level 31  
    wawer_rz wrote:
    Masz może jakieś linki do bibliotek? Bo już od dłuższego czasu szukam i nie mogę znaleźć odpowiedniego przykładu.


    No to moze trzymjamy sie tego libcurl-a bo wyglada ciekawie.

    http://curl.haxx.se/libcurl/c/post-callback.html

    Obok na stronie masz reszte przykladow. jak czegos nie rozuiesz lub nie wiesz jak zrobic to chetnie pomoge ale ten jak i inne przyklady powinny wyjasnic co i jak.
  • #19
    wawer_rz
    Level 10  
    Dzięki za olbrzymia pomoc. Już wcześniej patrzyłem na ten przykład.

    Na linuxsie (ubuntu 10.10) kompiluje się bez problemu. Otrzymuję:
    Quote:

    * About to connect() to localhost port 80 (#0)
    * Trying ::1... * connected
    * Connected to localhost (::1) port 80 (#0)
    > POST / HTTP/1.1
    Host: localhost
    Accept: */*
    Content-Length: 221
    Content-Type: application/x-www-form-urlencoded

    < HTTP/1.1 200 OK
    < Date: Mon, 09 May 2011 18:37:41 GMT
    < Server: Apache/2.2.16 (Ubuntu)
    < X-Powered-By: PHP/5.3.3-1ubuntu9.4
    < Vary: Accept-Encoding
    < Content-Length: 167
    < Content-Type: text/html
    <
    <form action="forums.html" method="post">
    <textarea name="pole1" style="width: 200px; height: 100px;">
    </textarea><br />
    <input type="submit" value="Zapisz" />
    </form>
    * Connection #0 to host localhost left intact
    * Closing connection #0

    Wszystko ok.

    Natomiast mam taki plik:

    Code: php
    Log in, to see the code


    Zapisuje to co dostanie w pole1 w pliku txt. Jak za pomocą programu przesłać tego XML-a?

    Mam jeszcze takie pytanie co muszę mieć zainstalowane aby program mógł się uruchamiać na MMnet1002 lub KT-SBC-SAM9-1(aktualnie testowany). Czy musi być doinstalowany pakiet libcurl??

    Po odpaleniu dostaje taki komunikat:

    Quote:
    * About to connect() to 192.168.228.5 port 7001 (#0)
    * Trying 192.168.228.5... * connected
    * Connected to 192.168.228.5 (192.168.228.5) port 7001 (#0)
    > POST /ProductionInterface.jsp HTTP/1.1
    Host: 192.168.228.5:7001
    Accept: */*
    Content-Length: 229
    Content-Type: application/x-www-form-urlencoded

    < HTTP/1.1 404 Not Found
    < Date: Tue, 10 May 2011 06:40:03 GMT
    < Content-Length: 1214
    < Content-Type: text/html
    < Connection: close
    <
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Draft//EN">
    <HTML>
    <HEAD>
    <TITLE>Error 404--Not Found</TITLE>
    <META NAME="GENERATOR" CONTENT="WebLogic Server">
    </HEAD>
    <BODY bgcolor="white">
    <FONT FACE=Helvetica><BR CLEAR=all>
    <TABLE border=0 cellspacing=5><TR><TD><BR CLEAR=all>
    <FONT FACE="Helvetica" COLOR="black" SIZE="3"><H2>Error 404--Not Found</H2>
    </FONT></TD></TR>
    </TABLE>
    <TABLE border=0 width=100% cellpadding=10><TR><TD VALIGN=top WIDTH=100% BGCOLOR=white><FONT FACE="Courier New"><FONT FACE="Helvetica" SIZE="3"><H3>From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:</H3>
    </FONT><FONT FACE="Helvetica" SIZE="3"><H4>10.4.5 404 Not Found</H4>
    </FONT><P><FONT FACE="Courier New">The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent.</p><p>If the server does not wish to make this information available to the client, the status code 403 (Forbidden) can be used instead. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address.</FONT></P>
    </FONT></TD></TR>
    </TABLE>

    </BODY>
    </HTML>
    * we are done reading and this is set to close, stop send
    * Closing connection #0


    Nie wiem dla czego.

    Problem rozwiązany: Zły url ....

    Rozwiązanie w linku Fantoma. Dzięki wielkie.

    Mam jeszcze pytanie jak dołączyć do kross kompilatora biblioteki libcurl?
  • #20
    wawer_rz
    Level 10  
    Sobie poradziłem nie jest to zbyt elegancki sposób ale ...
    Idea jest prosta w programie tworzę stringa (XML do wysłania na serwer). Tego stringa wpisuję w skrypt sh a następnie wywołuję. Poniżej kod. Problem był następujący - crosskompilator nie potrafił skompilować programu z curl-em. To jest ominięcie kompilatora.

    Code: cpp
    Log in, to see the code


    Temat uważam za nie do końca rozwiązany bo wolę XML-a wysyłać w głównym programie.
  • #21
    fantom
    Level 31  
    Pytanie nr 1:
    Czy masz osobna biblioteke libcurl dla architektury ARM czy probujesz zlinkowac program z ta z Ubuntu dla x86 ?

    Pytanie nr 2 (uzaleznione od pytania nr 1):
    Jesli masz libcurl dla platformy ARM to wrzuc tutaj bledy jakie dostajesz podczas linkowania.
  • #22
    wawer_rz
    Level 10  
    Ad.1
    Nie mam libcurl dla platformy arm w cross-kompilatorze. Muszę znaleźć. Tylko pytanie gdzie ją umieścić. Albo jak skompilować źródła dla arm?
  • #23
    fantom
    Level 31  
    wawer_rz wrote:
    Ad.1
    Nie mam libcurl dla platformy arm w cross-kompilatorze. Muszę znaleźć. Tylko pytanie gdzie ją umieścić. Albo jak skompilować źródła dla arm?


    W takim razie proponuje sobie sciagnac gotowego libcurl-a dla ARM stad, rozpakowac ta paczke za pomoca ar a nastepnie data.tar.gz za pomoca tar. Potem do swojej kompilacji ustaw
    arm-linux-gcc -I/katalog/usr/include -L/katalog/usr/lib -lcurl .... (i dalej co tam masz)

    (gdzie katalog to sciezka do katalogu gdzie rozpakowales data.tar.gz). Nastepnie przekopiuj sobie calego libcurl-a na platforme docelowa. Chyba ze masz juz libcurl-a na platformie docelowej to wtedy mozesz skopiowac sama biblioteke libcurl na platforme do budowania i wskazac do niej sciezke tak jak powyzej. Mam nadzieje ze napisalem to w zrozumialy sposob.
  • #24
    wawer_rz
    Level 10  
    Robiłem tak jak Pisałeś. Mój plik makefile:

    #
    # File names.
    #
    
    # Executable file:
    EXECUTABLE=	count
    # Sources:
    SOURCES=	$(wildcard *.c)
    # Object files:
    OBJECTS=	$(SOURCES:.c=.o)
    
    #
    # Compiler configuration.
    #
    
    CC=			/home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/arm-none-linux-gnueabi-gcc
    CFLAGS=		-I/home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/include -L/home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/lib -lcurl -Wall -pedantic -std=c99
    LFLAGS=		     
    
    #
    # Makefile rules.
    #
    
    $(EXECUTABLE): $(OBJECTS)
    	$(CC) $(LFLAGS) $^ -o $@
    
    %.o: %.c
    	$(CC) $(CFLAGS) -c $< -o $@
    
    clean:
    	rm -f $(OBJECTS) $(EXECUTABLE)
    
    .PHONY: all clean send
    


    Po poleceniu make:

    Quote:
    wawer@wawer:~/Dokumenty/ares2.1/current_work/Test2.2$ make
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/arm-none-linux-gnueabi-gcc -I/home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/include -L/home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/lib -lcurl -Wall -pedantic -std=c99 -c simplepost.c -o simplepost.o
    simplepost.c:3:23: error: curl/curl.h: No such file or directory
    simplepost.c: In function 'main':
    simplepost.c:7: error: 'CURL' undeclared (first use in this function)
    simplepost.c:7: error: (Each undeclared identifier is reported only once
    simplepost.c:7: error: for each function it appears in.)
    simplepost.c:7: error: 'curl' undeclared (first use in this function)
    simplepost.c:8: error: 'CURLcode' undeclared (first use in this function)
    simplepost.c:8: error: expected ';' before 'res'
    simplepost.c:12: warning: implicit declaration of function 'curl_easy_init'
    simplepost.c:14: warning: implicit declaration of function 'curl_easy_setopt'
    simplepost.c:14: error: 'CURLOPT_URL' undeclared (first use in this function)
    simplepost.c:15: error: 'CURLOPT_POSTFIELDS' undeclared (first use in this function)
    simplepost.c:16: error: 'res' undeclared (first use in this function)
    simplepost.c:16: warning: implicit declaration of function 'curl_easy_perform'
    simplepost.c:19: warning: implicit declaration of function 'curl_easy_cleanup'
    make: *** [simplepost.o] Błąd 1


    Czy robię coś nie tak?
  • #25
    ksz
    Level 15  
    simplepost.c:3:23: error: curl/curl.h: No such file or directory 

    Ustaw na prawidłową ścieżkę..
    Jeżeli curl.h masz w /home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/include, to zamiast curl/curl.h w simplepost.c daj curl.h, ale najlepiej abyś pliki include biblioteki curl miał w /home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/include/curl albo dodał ścieżkę do nich opcją -I
  • #26
    wawer_rz
    Level 10  
    Dzięki za pomoc. Dodałem biblioteki curl tak jak Opisałeś. Kompiluję:
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/arm-none-linux-gnueabi-gcc  simplepost.o -o count
    simplepost.o: In function `main':
    simplepost.c:(.text+0xc): undefined reference to `curl_easy_init'
    simplepost.c:(.text+0x30): undefined reference to `curl_easy_setopt'
    simplepost.c:(.text+0x48): undefined reference to `curl_easy_setopt'
    simplepost.c:(.text+0x50): undefined reference to `curl_easy_perform'
    simplepost.c:(.text+0x60): undefined reference to `curl_easy_cleanup'
    collect2: ld returned 1 exit status
    make: *** [count] Błąd 1
    

    Dzisiaj o normalnej porze pokombinuję. Jednak proszę o wskazówki.
  • #27
    fantom
    Level 31  
    Brakuje opcji -lcurl w LFLAGS (swoja droga konwencja nazewnicza to LDFLAGS) bo to jest opcja linkera a nie kompilatora.
  • #28
    wawer_rz
    Level 10  
    Teraz to już nie wiem dlaczego otrzymuję komunikat:
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/arm-none-linux-gnueabi-gcc -lcurl simplepost.o -o count
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.0/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lcurl
    collect2: ld returned 1 exit status
    make: *** [count] Błąd 1
  • #29
    fantom
    Level 31  
    wawer_rz wrote:
    Teraz to już nie wiem dlaczego otrzymuję komunikat:
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/arm-none-linux-gnueabi-gcc -lcurl simplepost.o -o count
    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.0/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lcurl
    collect2: ld returned 1 exit status
    make: *** [count] Błąd 1


    Sciezka tez musi byc podana co by wiedzial gdzie ma tej biblioteki szukac ;-)
  • #30
    wawer_rz
    Level 10  
    Nadal mam problem (dodam że kilka razy przeczytałem powyższe posty). NIe wiem co robię źle wpisuję:
    Code: bash
    Log in, to see the code


    I otrzymuję:

    /home/wawer/Dokumenty/ares2.1/arm-2007q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.0/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -l/home/wawer/Dokumenty/ares2.1/arm-2007q1/usr/include/curl
    collect2: ld returned 1 exit status
    


    Jeszcze wkleję listowania:
    Code: bash
    Log in, to see the code