6. Gniazda

Listing 6.1: Tworzenie gniazda (str. 44):

int sockd;
struct sockaddr_in my_name;

/* utworzenie gniazda */
sockd = socket(PF_INET, SOCK_STREAM, 0);
if (sockd == -1){
   perror("Tworzenie gniazda");
   exit(1);
}

/* nadanie nazwy */
my_name.sin_family = PF_INET;
my_name.sin_addr.s_addr = INADDR_ANY;
my_name.sin_port = htons(6500);

status = bind(sockd, (struct sockaddr*)&my_name, sizeof(my_name));
if (status == -1){
   perror("Nadanie nazwy");
   exit(1);
}

Listing 6.2: Nawiązanie połaczenia (str. 45):

int sockd;
struct sockaddr_in serv_name;

/* utworzenie gniazda */
sockd = socket(AF_INET, SOCK_STREAM, 0);
if (sockd == -1){
   perror("Tworzenie gniazda");
   exit(1);
}

/* nazwa serwera */
serv_name.sin_family = AF_INET;
serv_name.sin_addr.s_addr = inet_addr(argv[1]);
serv_name.sin_port = htons(6500);

/* polaczenie z serwerem */
status= connect(sockd,(struct sockaddr*)&serv_name,sizeof(serv_name));
if (status == -1){
   perror("Nawiazanie polaczenia");
   exit(1);
}

Listing 6.3: Oczekiwanie na połaczenia (str. 47):

int sockd,sockd2;
int addrlen;
struct sockaddr_in peer_name;
int status;

/* utworzenie gniazda */
...
/* nadanie nazwy */
...

status = listen(sockd, 5);
if (status == -1){
   perror("Nasluchiwanie");
   exit(1);
}

/* oczekiwanie na polaczenie */
addrlen = sizeof(peer_name);
sockd2 = accept(sockd, (struct sockaddr*)&peer_name, &addrlen);
if (sockd2 == -1){
   perror("Akceptacja polaczenia");
   exit(1);
}

Listing 6.4: Klient usługi daytime (str. 48)

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

#define MAX_BUF 100
#define S_PORT 13

    main(int argc, char* argv[]){
      int sockd;
      int addrlen, lbajt;
      struct sockaddr_in serv_name;
      char buf[MAX_BUF];
      int status;
   
      if (argc < 2){
         fprintf(stderr, "Uzyj %s <adres ip>\n", argv[0]);
         exit(1);
      }
   /* utworzenie gniazda */
      sockd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockd == -1){
         perror("Tworzenie gniazda");
         exit(1);
      }
   
   /* nazwa serwera */ 
      serv_name.sin_family = AF_INET;
      inet_aton(argv[1], &serv_name.sin_addr); 
      serv_name.sin_port = htons(S_PORT);
   
   /* polaczenie z serwerem */
      status = connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name));
      if (status == -1){
         perror("Nawiazanie polaczenia");
         exit(1);
      }
   
      if ((lbajt = read(sockd, buf, MAX_BUF))>0){ 
         write(1, buf, lbajt);
      }
      else if (lbajt == -1){
         perror("Blad odczytu z gniazda");
         exit(1);
      }
   
      close(sockd);
   }

Listing 6.5: Serwer usługi echo z konwersją wielkości liter (str. 49)

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

#define MAX_BUF 10
#define S_PORT 6389

    int main(){
      int sockd,sockd2;
      int addrlen;
      struct sockaddr_in my_name, peer_name;
      int status;
   
   /* utworzenie gniazda */
      sockd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockd == -1){
         perror("Tworzenie gniazda");
         exit(1);
      }
   
   /* nadanie nazwy */
      my_name.sin_family = AF_INET;
      my_name.sin_addr.s_addr = INADDR_ANY;
      my_name.sin_port = htons(S_PORT);
   
      status = bind(sockd, (struct sockaddr*)&my_name, sizeof(my_name));
      if (status == -1){
         perror("Nadanie nazwy");
         exit(1);
      }
   
      status = listen(sockd, 5);
      if (status == -1){
         perror("Nasluchiwanie");
         exit(1);
      }
   
      for(;;){
         int i, lbajtr, lbajtw;
         char* bufptr;
         char buf[MAX_BUF];
      
      /* oczekiwanie na polaczenie */
         addrlen = sizeof(peer_name);
         sockd2 = accept(sockd, (struct sockaddr*)&peer_name, &addrlen);
         if (sockd2 == -1){
            perror("Akceptacja polaczenia");
            exit(1);
         }
      
         while ((lbajtr = read(sockd2, buf, MAX_BUF))>0){ 
            for(i=0;i<lbajtr;i++)
               buf[i] = toupper( buf[i] );
            lbajtw = 0;
            bufptr = buf;
            while (lbajtw < lbajtr){
               lbajtr -= lbajtw;
               bufptr += lbajtw;
               lbajtw = write(sockd2, bufptr, lbajtr);
               if (lbajtw == -1) {
                  perror("Blad odczytu z gniazda");
                  exit(1);
               }
            }
         }
         if (lbajtr == -1){
            perror("Blad odczytu z gniazda");
            exit(1);
         }
         close(sockd2);
      }
   }

Poprzedni temat

5. Sygnały

Ta strona