tookie009 Temat założony przez niniejszego użytkownika |
[C++, socket] odbieranie danych z serwera HTTP, problem z funkcja revc » 2013-12-16 15:28:03 witam, mam kamere, podlaczona do sieci z moim omputerem, ktora potrafi rozpoznac ruch. Jezeli cos sie poruszylo, wysyla ona na konkretnym porcie wiadomosc. Chce odbierac ta wiadomosc budujac swoj wlasny socket. Niestey funkcja recv zawiesza mi cala aplikacje, tak, ze zeby cokolwioek mi sie dalej wykonalo trwa to bardzo dlugo. Ostatecznie funkcja recv zwraca wartosc 0, ale do buffora odbierajacego ta wiadomosc nie zostaje nic zapisane. Wiecie moze, co robie zle?
#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <unistd.h> #include <string.h> #include <iostream>
using namespace std;
int main() { sockaddr_in aaa; aaa.sin_family = AF_INET; aaa.sin_port = htons( 80 ); inet_aton( "192.168.1.200", &( aaa.sin_addr ) ); int sock = socket( AF_INET, SOCK_STREAM, 0 ); if( sock ==- 1 ) cout << "SOCKETERRROROROR"; if( connect( sock,( sockaddr * ) & aaa, sizeof( aaa ) ) ==- 1 ) cout << "CONNECTERRROR"; char buff[ 1024 ]; memset( buff, 0, 1024 ); int antwort = recv( sock, buff, 1023, 0 ); if( antwort ==- 1 ) cout << "recvTERRROR"; if( antwort > 0 ) buff[ antwort ] = '\n'; cout << antwort; cout << buff; cout << buff; cout << "tcp" << endl; int h; cin >> h; close( sock ); return 0; }
Nastepny problem, zeby nie otwierac dowch watkow: caly ten program sluzy do tego, zeby obliczyc jaki czas uplynie od poruszenia sie obiektu w fokusie kamery do dostania tego komunikatu. Moja idea: postawie przed kamera lampke usb, ktora podlacze do komputera, i ktora bede wlaczal tym tez programem powyzej (jeszcze sporo tam brakuje ;)). Wlacze ta lampke ->zapisze sobie czas wlaczenia -> nasluchuje na konkretnym porcie na danie sygnalu, ze sie cos poruszylo -> odejmuje ten czas -> gotowy wynik. I tu pytaniem, jak moge nasluchiwac "okreslony czas", powiedzmy 50 sekund? Z gory dzieki za pomoc, ale socketow dopiero sie ucze. |
|
DejaVu |
» 2013-12-16 17:36:07 Może dane źle wysyłasz? |
|
tookie009 Temat założony przez niniejszego użytkownika |
» 2013-12-16 17:41:35 chodzi o to, ze lacze sie przez port 80 (html), tam jest zatem ta strona, na ktorej mam caly interfejs tej kamery, czyli powinienem takze dostac ta stronke z ramkami etc. Czy tu sie myle?? Zatem w powyzszym kodzie nie widzisz bledow? |
|
DejaVu |
» 2013-12-16 18:33:04 Nie odbieraj danych z protokołu HTTP 'swoją' implementacją klienta. Użyj do tego chociażby libcurl-a. Twój klient jest po prostu zły, bo oczekujesz na 1023 bajty, więc jeżeli serwer wyśle ich mniej to będziesz czekał tak długo, jak długo serwer utrzymuje połączenie aż do uzyskania timeouta. Poza tym komunikacja protokołem HTTP nie sprowadza się tylko i wyłącznie do akcji 'podłącz się i odbierz dane'. |
|
tookie009 Temat założony przez niniejszego użytkownika |
» 2013-12-16 20:58:47 mozna jakos zrobic tak, zeby nie czekal na te 1023 bajty, tylko odbieral tyle ile chce wyslac serwer? |
|
DejaVu |
» 2013-12-16 21:01:27 Zapoznaj się z dokumentacją protokołu HTTP, skoro koniecznie chcesz pisać 'własną' implementację HTTP. Możesz też pooglądać źródła libcurl-a jak oni to rozwiązali. Komunikacja sieciowa ma to do siebie, że musisz po drugiej stronie wiedzieć ile danych będzie do odebrania (jeżeli w ogóle chcesz zrozumieć sens danych odbieranych). Jak chcesz wiedzieć więcej, to wystarczy Googla spytać: np. http://stackoverflow.com/questions/5211473/problem-with-recv-on-a-tcp-connection/edit: Dodam jeszcze, że nie wiem czy da radę odczytywać dane w taki sposób w jaki Ty byś chciał przy pomocy komunikacji blokującej dla protokołu TCP, stosując transmisję HTTP. We własnej aplikacji mógłbyś zrobić po prostu rozłączenie klienta po stronie serwera po wysłaniu wszystkich danych i wówczas blokada z recv na kliencie by się zdjęła, ale w innym wypadku to raczej marnie widzę realizację Twojego pomysłu. Podsumowując, jak się nie zapoznasz ze specyfikacją protokołu HTTP to nie będziesz wiedział jak on działa. |
|
tookie009 Temat założony przez niniejszego użytkownika |
» 2013-12-16 21:45:24 skoro mowisz, ze http jest tu raczej nietypowym rozwiazaniem, wiec najlepiej bede szukal jakiejs dokumentacji do kamery, ktora zdradzi mi jak ten sygnal jest wysylany. Ja po prostu wyszedlem z zalozenia, ze tam przez http otrzymuje ten meldunek. Najlepiej bede testowal to jeszcze telnetem. W kazdym badz razie, dziekuje Tobie slicznie za pomoc, pomagacie mi Wy tu juz nie pierwszy raz, chetnie postawilbym wam piwo, jest gdzies tu ukryta opcja darowizny?
EDIT. nie jest przypadkiem tak, ze jezeli chcialbym odbierac ten kod za pomoca curla moze to sporo trwac? Wydaje mi sie, ze taki sygnal jest wysylany w przeciagu mnie niz jednej sekundy od wystapienia wydarzenia, takze curl moglby takze prowadzic do niedokladnych wynikow |
|
DejaVu |
» 2013-12-16 22:10:05 Tyle ile zajmuje serwerowi odpowiedź, tyle czasu odpowiedź będzie się pobierała. W kazdym badz razie, dziekuje Tobie slicznie za pomoc, pomagacie mi Wy tu juz nie pierwszy raz, chetnie postawilbym wam piwo, jest gdzies tu ukryta opcja darowizny?
|
Po prostu pomagaj innym na tyle na ile dysponujesz czasem :) Poza tym są osoby, które potrafią napisać, że jesteśmy głupi i beznadziejni więc... fajnie wiedzieć, że chociaż ktoś uważa inaczej :) |
|
« 1 » 2 |