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

UptoLike

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

58
exit (EXIT_FAILURE);
}
fprintf (stderr,
"Server: connect from host %s, port %hd.\n",
inet_ntoa (clientname.sin_addr),
ntohs (clientname.sin_port));
FD_SET (new, &active_fd_set);
}
else
{
if (read_from_client (i) < 0)
{
close (i);
FD_CLR (i, &active_fd_set);
}
}
}
}
}
Экстренные данные
Потоки экстренных данных (out-of-band data) передаются с большим
приоритетом, чем обычные данные. Обычно причина передачи экстренных данных -
передача сообщений об исключительных ситуациях. Как чтения, так и для отправки
экстренных данных функции recv и send должны быть выполнены с установленным
флагом в значение MSG_OOB. Обычные операции передачи и чтения данных не
принимают и не посылают экстренные данные.
Когда гнездо определяет, что поступили экстренные данные, оно генерирует
сигнал SIGURG процессу-владельцу гнезда или группе процессов гнезда (в случае
многопоточного приложения). Владельца гнезда можно установить используя команду
F_SETOWN функции fcntl. Возможно также определить обработчик сигнала.
Еще один способ определения момента поступления экстренных данных -
использование функции select.
Передача данных с помощью дейтаграмм
Пакеты данных, передаваемые с помощью дейтаграмм, независимы друг от
друга, порядок получения пакетов может отличаться от порядка отправки. Пакет
данных может не дойти до пункта назначения вовсе. Дейтаграммы не используют для
отправки данных соединения.
Функции accept и listen не используются для передачи дейтаграмм.
Обычный способ передачи дейтаграммы - использование функции sendto.
int sendto (int SOCKET, void *BUFFER. size_t SIZE, int FLAGS,
struct sockaddr *ADDR, socklen_t LENGTH)
Функция передает данные из буфера BUFFER через гнездо SOCKET на адрес
получателя, задаваемые аргументами ADDR и LENGTH. Аргумент SIZE задает размер
передаваемых данных.
Возвращаемое значение и коды ошибок аналогичны функции send. Однако не
стоит полагаться на систему при определении ошибок передачи данных. Наиболее
распространенной ошибкой является потеря пакета данных. Операционная система не
может определить ошибки, связанные с передачей данных.
Функция recvfrom считывает пакет дейтаграмм из гнезда и сообщает адрес
отправителя.
int recvfrom (int SOCKET, void *BUFFER, size_t SIZE,
int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)
                            exit (EXIT_FAILURE);
                        }
                        fprintf (stderr,
                                "Server: connect from host %s, port %hd.\n",
                                inet_ntoa (clientname.sin_addr),
                                ntohs (clientname.sin_port));
                        FD_SET (new, &active_fd_set);
                    }
                    else
                    {
                        if (read_from_client (i) < 0)
                        {
                            close (i);
                            FD_CLR (i, &active_fd_set);
                        }
                    }
                }
            }
       }

        Экстренные данные
        Потоки экстренных данных (out-of-band data) передаются с большим
приоритетом, чем обычные данные. Обычно причина передачи экстренных данных -
передача сообщений об исключительных ситуациях. Как чтения, так и для отправки
экстренных данных функции recv и send должны быть выполнены с установленным
флагом в значение MSG_OOB. Обычные операции передачи и чтения данных не
принимают и не посылают экстренные данные.
        Когда гнездо определяет, что поступили экстренные данные, оно генерирует
сигнал SIGURG процессу-владельцу гнезда или группе процессов гнезда (в случае
многопоточного приложения). Владельца гнезда можно установить используя команду
F_SETOWN функции fcntl. Возможно также определить обработчик сигнала.
        Еще один способ определения момента поступления экстренных данных -
использование функции select.

        Передача данных с помощью дейтаграмм
        Пакеты данных, передаваемые с помощью дейтаграмм, независимы друг от
друга, порядок получения пакетов может отличаться от порядка отправки. Пакет
данных может не дойти до пункта назначения вовсе. Дейтаграммы не используют для
отправки данных соединения.
        Функции accept и listen не используются для передачи дейтаграмм.
        Обычный способ передачи дейтаграммы - использование функции sendto.
       int sendto (int SOCKET, void *BUFFER. size_t SIZE, int FLAGS,
            struct sockaddr *ADDR, socklen_t LENGTH)
       Функция передает данные из буфера BUFFER через гнездо SOCKET на адрес
получателя, задаваемые аргументами ADDR и LENGTH. Аргумент SIZE задает размер
передаваемых данных.
       Возвращаемое значение и коды ошибок аналогичны функции send. Однако не
стоит полагаться на систему при определении ошибок передачи данных. Наиболее
распространенной ошибкой является потеря пакета данных. Операционная система не
может определить ошибки, связанные с передачей данных.
       Функция recvfrom считывает пакет дейтаграмм из гнезда и сообщает адрес
отправителя.
       int recvfrom (int SOCKET, void *BUFFER, size_t SIZE,
            int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)




       58