Gniazda w C pod linuxem

0

Szukalem troche w archiwum ale nic nie znalazlem :/ Dzis troche nieciekawie u mnie z szukaniem co mi juz Sheitar udowodnil :) ale wraz z opisem na jakiejs stronie napisalem sobie cos takiego:

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define DEST_IP   "10.12.110.57"
#define DEST_PORT 80

main()
{
      int sockfd;
      struct sockaddr_in dest_addr;
	struct hostent *h;
	char *msg,ip;
	
	h=gethostbyname("www.pedros.iglu.cz");
	ip = inet_ntoa(*((struct in_addr *)h->h_addr)); //tu mi cos krzyczy kompilator
	printf("IP: %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));

        sockfd = socket(AF_INET, SOCK_STREAM, 0); // tu sie ladnie otwiera

        dest_addr.sin_family = AF_INET;    
        dest_addr.sin_port = htons(80); 
        dest_addr.sin_addr.s_addr = inet_addr(ip);
        memset(&(dest_addr.sin_zero), '\0', 8);  

       
        connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
        
  	  recv(sockfd, msg, 1024, 0);
        printf("odebralem cos takiego: %s\n",msg);
        getch();
        close(sockfd);
        return(0);	
}

No wlasnie chicalbym aby program odbieral zawartosc strony www no i myslalem ze cos takiego jak napisalem bedzie dzialac a to jak na zlosc nie chce dzialac :) No i dlatego mam prosbe jak by mogl ktos to poprawic albo napisac co jest nie tak albo napisac mi sampla ktory pobiera tekst z danej strony www Dla kogos kto w c smiga jak sputnik to mysle ze nie bedzie wiekszego problemu ja z c dopiero zaczynam wiec prosilbym o wyrozumialosc :)

0

No fakt tam byl blad poprawilem go ale kompilator nadal wywala:

klient.c: In function `main':
klient.c:16: warning: assignment makes pointer from integer without a cast
klient.c:17: dereferencing pointer to incomplete type
klient.c:17: warning: assignment makes pointer from integer without a cast
klient.c:18: dereferencing pointer to incomplete type

A z tym char to na swoje usprawiedliwienie mam to ze w delphi string byl stringiem :)

a
recv(sockfd, msg, 1024, 0);
to nie jest odpieranie danych?

0
char ip; // <- tyle oznacza twoja deklaracja

ip = inet_ntoa(*((struct in_addr *)h->h_addr)); //tu mi cos krzyczy kompilator

Jak to może działać? Całe tekstowe ip w jednym bajcie?

...
char* msg;
char* ip;

char *msg,*ip

I jezeli inet_nto2 nie przydziela pamięci danym zwracanym, to trzeba samemmu tą pamieć przygotować i skopiować do *ip (strdup?).

Poza tym tu uzyskujesz tylko połaczenie, dalej musisz zassać dane.
(sorry, fakt, odbierasz dane)

*((struct in_addr *)h->h_addr) // coś Ci tu krzyczy.
Kompilator oczekuje ip zapisanego jako long (może unsigned long), stąd pierwszy łorning.

1

btw nie zapomin o requescie wyslanym do serwa (HTTP ;p)...
taki request (najprostszy) wyglada zazwyczaj tak:

GET sciezka HTTP/1.1\r\n
HOST: host\r\n\r\n

np

GET / HTTP/1.1\r\n
HOST: www.onet.pl\r\n\r\n

dopiero po tym serv ci wysle strone

jak chcesz cos ciekawego wiecej pisac, tyo zapoznaj sie z RFC 2616 (HTTP 1.1)

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