Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 59 стр.

UptoLike

Составители: 

59
BUFFER указывает область памяти, куда будут записаны считанные данные,
SIZE задает размер используемого буфера. Если пакет имеет размер, больший SIZE,
принимаются SIZE байтов, а окончание пакета теряется. Поэтому при использовании
дейтаграмм необходимо заранее знать размер передаваемых пакетов данных.
Аргументы ADDR и LENGTH-PTR указывают используются для возвращения
адреса отправителя. Если эта информация не нужна, ADDR может быть нулевым
указателем.
Возвращаемое значение и коды ошибок идентичны функции recv.
Для получения дейтаграмм могут использоваться также и функции recv и read.
Приведем примеры сервера и клиента, работающих через механизм
дейтаграмм.
Сервер ожидает прихода сообщения от клиента, а затем передает это
сообщение обратно.
В примере используется функция make_named_socket, описанная в разделе
создания гнезд в локальном пространстве имен.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SERVER "/tmp/serversocket"
#define MAXMSG 512
int main (void)
{
extern int make_named_socket (const char *name);
int sock;
char message[MAXMSG];
struct sockaddr_un name;
size_t size;
int nbytes;
/* Remove the filename first, it's ok if the call fails */
unlink (SERVER);
/* Make the socket, then loop endlessly. */
sock = make_named_socket (SERVER);
while (1)
{
/* Wait for a datagram. */
size = sizeof (name);
nbytes = recvfrom (sock, message, MAXMSG, 0,
(struct sockaddr *) & name, &size);
if (nbytes < 0)
{
perror ("recfrom (server)");
exit (EXIT_FAILURE);
}
/* Give a diagnostic message. */
fprintf (stderr, "Server: got message: %s\n", message);
/* Bounce the message back to the sender. */
nbytes = sendto (sock, message, nbytes, 0,
(struct sockaddr *) & name, size);
if (nbytes < 0)
{
perror ("sendto (server)");
exit (EXIT_FAILURE);
        BUFFER указывает область памяти, куда будут записаны считанные данные,
SIZE задает размер используемого буфера. Если пакет имеет размер, больший SIZE,
принимаются SIZE байтов, а окончание пакета теряется. Поэтому при использовании
дейтаграмм необходимо заранее знать размер передаваемых пакетов данных.
        Аргументы ADDR и LENGTH-PTR указывают используются для возвращения
адреса отправителя. Если эта информация не нужна, ADDR может быть нулевым
указателем.
        Возвращаемое значение и коды ошибок идентичны функции recv.
        Для получения дейтаграмм могут использоваться также и функции recv и read.
        Приведем примеры сервера и клиента, работающих через механизм
дейтаграмм.
        Сервер ожидает прихода сообщения от клиента, а затем передает это
сообщение обратно.
        В примере используется функция make_named_socket, описанная в разделе
создания гнезд в локальном пространстве имен.
       #include   
       #include   
       #include   
       #include   
       #include   

       #define SERVER   "/tmp/serversocket"
       #define MAXMSG   512

       int main (void)
       {
           extern int make_named_socket (const char *name);
           int sock;
           char message[MAXMSG];
           struct sockaddr_un name;
           size_t size;
           int nbytes;

           /* Remove the filename first, it's ok if the call fails */
           unlink (SERVER);

           /* Make the socket, then loop endlessly. */
           sock = make_named_socket (SERVER);
           while (1)
           {
               /* Wait for a datagram. */
               size = sizeof (name);
               nbytes = recvfrom (sock, message, MAXMSG, 0,
                                  (struct sockaddr *) & name, &size);
               if (nbytes < 0)
               {
                   perror ("recfrom (server)");
                   exit (EXIT_FAILURE);
               }

                /* Give a diagnostic message. */
                fprintf (stderr, "Server: got message: %s\n", message);

                /* Bounce the message back to the sender. */
                nbytes = sendto (sock, message, nbytes, 0,
                                 (struct sockaddr *) & name, size);
                if (nbytes < 0)
                {
                    perror ("sendto (server)");
                    exit (EXIT_FAILURE);



                                                                               59