Ĺadny brzuch
Witam, bawie sie protokołem gg i wszystko byłoby dobrze gdyby nie to że nie moge pobrać odpowiedzi serwera appmsg.gadu-gadu.pl.
Program łączy sie z serwerem i wysyła treść pliku login.txt (treść zapytania), ale nie odbiera poprawnie odpowiedzi, a właściwie nic nie odbiera.
#include <netdb.h> #include <sys/socket.h> #include <stdio.h> #include <iostream.h> #include <fstream.h> #define PORT 80 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; if (argc != 2) { printf("usage: client hostname\n"); return 0; } if ((he=gethostbyname(argv[1])) == NULL) { printf("gethostbyname\n"); return 0; } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("socket\n"); return 0; } their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '', 8); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { printf("connect\n"); close(sockfd); return 0; } //połączony char login [500]; fstream czyt("login.txt"); if(!czyt){printf("missing login.txt file\n"); return 0;} char c;int licznik=0; while(czyt.get©)login[licznik++]=c; //czytanie z pliku do tablicy int wyslane=send(sockfd, login, licznik-1, 0); //wysłanie danych if (wyslane== -1) {printf("send\n"); return 0;} else printf("data sent: %i bytes \n", wyslane); //ile bajtów if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) printf("read\n"); //obiór buf[numbytes] = ''; printf("Received: %s\n", buf); close(sockfd); return 0; }treść login.txtGET /appsvc/appmsg4.asp?fmnumber=7986272&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0 Host: appmsg.gadu-gadu.pl Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* Accept-Language: pl User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Pragma: no-cacheJeżeli wie ktoś dlaczego takie rozwiązanie nie działa to proszę pisać.
Odpal sniffer i porównaj Twoją komunikację z komunikacją klienta GG ;].
Wysyłasz na końcu dwie nowe linie (bo nie widze tego w Twoim pliku)?
Poprawiłem plik dodając te dwie puste linie i nadal to samo <_< . Co ciekawe wysłałem to przez telnet i dostałem poprawną odpowiedź, więc problem jest w sposobie odbierania (tak myśle).
Korzystasz z recv bez żadnego wątku?
Tak jak w podanym przeze mnie kodzie, nie używam wątków tylko czekam aż funkcja recv() coś odbierze.
#define MAXDATASIZE 100
Dość mały ten buffer, do tego odbierasz go tylko raz. Polegać na samym recv bez wątku nie jest zbyt dobrym rozwiązaniem. Myślę, że właśnie tu jest problem.
Co do wysyłania zapytania to wystarczy samo:
GET /appsvc/appmsg4.asp?fmnumber=7986272&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0 r/n/r/n
Użytkownik ~RolRain edytował ten post 23 sierpień 2007, 10:55
Chciałbym spróbować z wątkiem tylko że nie mam pojęcia jak to na linuksie napisać :P . Może wiecie o jakis przykładach/kursach o wątkach?
Edit: już mam fajny kurs, niedługo powinieniem coś napisać.
Użytkownik logic edytował ten post 23 sierpień 2007, 13:09
Wątek w tym przypadku, jest zupełnie nie potrzebny. Błąd w tym kodzie, jest z wysłaniem zapytania, nic nie wysyła. Nie potrzebnie korzystasz z plików do przechowywania nagłówka http.
Wystarczy:
char req[100]; sprintf(req, "GET /appsvc/appmsg4.asp?fmnumber=%d&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0\r\n\r\n", uin); int wyslane=send(sockfd, req, strlen(req), 0); //wysłanie danych
Mam nadzieję, że ten kod żądania jest prawidłowy ;).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Program łączy sie z serwerem i wysyła treść pliku login.txt (treść zapytania), ale nie odbiera poprawnie odpowiedzi, a właściwie nic nie odbiera.
#include <netdb.h> #include <sys/socket.h> #include <stdio.h> #include <iostream.h> #include <fstream.h> #define PORT 80 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; if (argc != 2) { printf("usage: client hostname\n"); return 0; } if ((he=gethostbyname(argv[1])) == NULL) { printf("gethostbyname\n"); return 0; } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("socket\n"); return 0; } their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '', 8); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { printf("connect\n"); close(sockfd); return 0; } //połączony char login [500]; fstream czyt("login.txt"); if(!czyt){printf("missing login.txt file\n"); return 0;} char c;int licznik=0; while(czyt.get©)login[licznik++]=c; //czytanie z pliku do tablicy int wyslane=send(sockfd, login, licznik-1, 0); //wysłanie danych if (wyslane== -1) {printf("send\n"); return 0;} else printf("data sent: %i bytes \n", wyslane); //ile bajtów if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) printf("read\n"); //obiór buf[numbytes] = ''; printf("Received: %s\n", buf); close(sockfd); return 0; }treść login.txtGET /appsvc/appmsg4.asp?fmnumber=7986272&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0 Host: appmsg.gadu-gadu.pl Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* Accept-Language: pl User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Pragma: no-cacheJeżeli wie ktoś dlaczego takie rozwiązanie nie działa to proszę pisać.
Odpal sniffer i porównaj Twoją komunikację z komunikacją klienta GG ;].
Wysyłasz na końcu dwie nowe linie (bo nie widze tego w Twoim pliku)?
Poprawiłem plik dodając te dwie puste linie i nadal to samo <_< . Co ciekawe wysłałem to przez telnet i dostałem poprawną odpowiedź, więc problem jest w sposobie odbierania (tak myśle).
Korzystasz z recv bez żadnego wątku?
Tak jak w podanym przeze mnie kodzie, nie używam wątków tylko czekam aż funkcja recv() coś odbierze.
#define MAXDATASIZE 100
Dość mały ten buffer, do tego odbierasz go tylko raz. Polegać na samym recv bez wątku nie jest zbyt dobrym rozwiązaniem. Myślę, że właśnie tu jest problem.
Co do wysyłania zapytania to wystarczy samo:
GET /appsvc/appmsg4.asp?fmnumber=7986272&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0 r/n/r/n
Użytkownik ~RolRain edytował ten post 23 sierpień 2007, 10:55
Chciałbym spróbować z wątkiem tylko że nie mam pojęcia jak to na linuksie napisać :P . Może wiecie o jakis przykładach/kursach o wątkach?
Edit: już mam fajny kurs, niedługo powinieniem coś napisać.
Użytkownik logic edytował ten post 23 sierpień 2007, 13:09
Wątek w tym przypadku, jest zupełnie nie potrzebny. Błąd w tym kodzie, jest z wysłaniem zapytania, nic nie wysyła. Nie potrzebnie korzystasz z plików do przechowywania nagłówka http.
Wystarczy:
char req[100]; sprintf(req, "GET /appsvc/appmsg4.asp?fmnumber=%d&version="5, 0, 5, 107"&fmt=2&lastmsg=590 HTTP/1.0\r\n\r\n", uin); int wyslane=send(sockfd, req, strlen(req), 0); //wysłanie danych
Mam nadzieję, że ten kod żądania jest prawidłowy ;).