next up previous contents
Next: Удаленный вызов процедур. Up: Сокеты. Previous: Закрытие сокетов.   Contents

Приложение архитектуры клиент-сервер с использованием сокетов.

Пример-оболочка программы "Клиент" (рис. 32)

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <stdio.h>

#define ADDRESS "mysocket" /* адрес для связи */

 

void main ()

{

  char c;

  int i, s, len;

  FILE *fp;

  struct sockaddr_un sa;

 

  /* получаем свой сокет-дескриптор: */

  if ((s = socket (AF_UNIX, SOCK_STREAM, 0))<0) {

    perror ("client: socket"); exit(1);

  }

 

  /* создаем адрес, по которому будем связываться с сервером: */

  sa.sun_family = AF_UNIX;

  strcpy (sa.sun_path, ADDRESS);

  /* пытаемся связаться с сервером: */

  len = sizeof ( sa.sun_family) + strlen ( sa.sun_path);

  if ( connect ( s, &sa, len) < 0 ){

    perror ("client: connect"); exit (1);

  }

 

  /* читаем сообщения сервера */

  fp = fdopen (s, "r");

  c = fgetc (fp);

  /* обрабатываем информацию от сервера

  ...................................

  */

 

  /* посылаем ответ серверу */

  send (s, "client", 7, 0);

  /* продолжаем диалог с сервером, пока в этом есть необходимость

  ............................

  */

 

  /* завершаем сеанс работы */

  close (s);

  exit (0);

}

Рис. 32. Клиентская часть приложения.

Пример-оболочка программы "Сервер" (рис. 33)

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <stdio.h>

#define ADDRESS "mysocket" /* адрес для связи */

 

void main ()

{

  char c;

  int i, d, d1, len, ca_len;

  FILE *fp;

  struct sockaddr_un sa, ca;

 

  /* получаем свой сокет-дескриптор: */

  if((d = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) {

    perror ("client: socket"); exit (1);

  }

 

  /* создаем адрес, c которым будут связываться клиенты */

  sa.sun_family = AF_UNIX;

  strcpy (sa.sun_path, ADDRESS);

  /* связываем адрес с сокетом; уничтожаем файл с именем ADDRESS,

   если он существует, для того, чтобы вызов bind завершился успешно */

  unlink (ADDRESS);

  len = sizeof ( sa.sun_family) + strlen (sa.sun_path);

  if ( bind ( d, &sa, len) < 0 ) {

     perror ("server: bind"); exit (1);

  }

 

  /* слушаем запросы на сокет */

  if ( listen ( d, 5) < 0 ) {

  perror ("server: listen"); exit (1);

  }

 

  /* связываемся с клиентом через неименованный сокет

    с дескриптором d1:*/

  if (( d1 = accept ( d, &ca, &ca_len)) < 0 ) {

    perror ("server: accept"); exit (1);

  }

 

  /* пишем клиенту: */

  send (d1, "server", 7, 0);

  /* читаем запрос клиента */

  fp = fdopen (d1, "r");

  c = fgetc (fp);

  /* ................................ */

  /* обрабатываем запрос клиента, посылаем ответ и т.д.

   ........................... */

  /* завершаем сеанс работы */

  close (d1);

  exit (0);

}

Рис. 32. Серверная часть приложения.


next up previous contents
Next: Удаленный вызов процедур. Up: Сокеты. Previous: Закрытие сокетов.   Contents
2003-12-09