C/Przykłady z komentarzem: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m poprawa linków
Kj (dyskusja | edycje)
Nie podano opisu zmian
Linia 88:
}
 
=== Zalążek przeglądarki ===
Zajmiemy się tym razem inną kwestią, a mianowicie programowaniem sieci. Jest to zagadniene bardzo ostatnio popularne. Nasz 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 kod:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXRCVLEN 512
#define PORTNUM 80
char *query = "GET / HTTP1.1\n\n";
int main(int argc, char *argv[])
{
char buffer[MAXRCVLEN+1];
int len, mysocket;
struct sockaddr_in dest;
char *host_ip = NULL;
if (argc != 2) {
printf ("Podaj adres serwera!\n");
exit (1);
}
host_ip = argv[1];
mysocket = socket(AF_INET, SOCK_STREAM, 0);
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(host_ip); /* ustawiamy adres hosta */
dest.sin_port = htons (PORTNUM); /* numer portu przechowuje dwubajtowa zmienna - musimy ustalić porządek sieciowy - Big Endian */
memset(&(dest.sin_zero), '\0', 8); /* zerowanie reszty struktury */
connect(mysocket, (struct sockaddr *)&dest,sizeof(struct sockaddr)); /* łączymy się z hostem */
write (mysocket, query, strlen(query)); /* wysyłamy zapytanie */
len=read(mysocket, buffer, MAXRCVLEN); /* i pobieramy odpowiedź */
buffer[len]='\0';
printf("Rcvd: %s",buffer);
close(mysocket); /* zamykamy gniazdo */
return EXIT_SUCCESS;
}
 
Powyższy przykład może być odrobinę niezrozumiały, dlatego przyda się kilka słów wyjaśnienia. Pliki nagłówkowe, które dołączamy zawierają deklarację nowych dla Ciebie funkcji - socket(), connect(), write() oraz read(). Oprócz tego spotkałeś się z nową strukturą - sockaddr_in. Wszystkie te obiekty są niezbędne do stworzenia połączenia.
{{TODO|szczegółowy opis}}
<noinclude><small>< [[C]]</small></noinclude>