211
Zajmiemy się tym razem inną kwestią, a mianowicie programowaniem sieci. Jest to zagadnienie Itardzo ostatnio popularne. Nas/, program będzie miał za zadanie połączyć się z serwerem, którego adres użytkownik będzie podawał jako pierwszy parametr programu, wysłać zapytanie HTTP i odebrać treść, którą wyśle do nas serwer. Zacznijmy może od tego, że obsługa sieci jest niemal identyczna w różnych systemach operacyjnych. Na przykład między systemami z rodziny Unix oraz Windowsem różnica polega tylko na dołączeniu innych plików nagłówkowych (dla Windowsa winsock2.h). Przeanalizujmy zatem poniższy kiwi:
•include <stdio.h>
•include <stdlib.h>
•include <string.h>
•include <unistd.h>
•include <arpa/met.h>
•include <sys/types.h>
•include <netinet/in.h>
•include <sys/socket.h>
•define MAXRCVLEN 512 •define PORTNUM 80
char *query ■ ”GET / HTTP1.l\n\n";
int main(int arge, char *argv[])
{
char buffer[MAXRCVLEN+l]; int len, nysockot; struct sockaddr.in dest; char *host_ip = NULL; if (arge !* 2) {
printf ("Podaj adres serwera!\n"); exit (1);
)
host.ip • argv[l];
mysocket = socket(AF.INET, SOCK.STREAH, 0); dest.sin.family ■ AF.INET;
dest.sin.addr.s.addr » inet.addr(host.ip); /• ustawiany adre3 hosta •/ dest.sin.port ■ htons (PORTNUK); /• nuner portu przechowuje dwubajtowa zaienna musimy ustalić porządek sieciowy - Big Endian •/ nemset(&(dest.sin.zero), *\0’, 8); /* zerowanie reszty struktury */
connect(mysocket, (struct sockaddr *)4dest.sizeof(struct sockaddr));
/* łączymy się z hostem •/
write (mysocket, query, strlen(query)); /* wysyłamy zapytanie •/ len-read(mysocket, buffer, MAXRCVLDJ); /• i pobioramy odpowiedź •/
buf fer[len]■ ’\0 *;
printf("Rcvd: Xs",buffer);
close(mysocket); /• zamykamy gniazdo •/
return EXIT_SUCCESS;