Системні виклики sendto() і recvfrom() 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Системні виклики sendto() і recvfrom()



Для відправки датаграм застосовується системний виклик sendto(). До числа параметрів цього виклику входять:

  • дескриптор сокета, через який відсилається датаграма;
  • адреса області пам'яті, де лежать дані, які повинні скласти змістовну частину датаграми, і їх довжина;
  • прапори, що визначають поведінку системного виклику (в нашому випадку вони завжди матимуть значення 0);
  • покажчик на структуру, що містить адресу сокета одержувача, і її фактична довжина.

Системний виклик повертає негативне значення при виникненні помилки і кількість реальна відісланих байт при нормальній роботі. Нормальне завершення системного виклику не означає, що датаграма вже покинула ваш комп'ютер! Датаграма спочатку поміщається в системний мережний буфер, а її реальна відправка може відбутися після повернення з системного виклику. Виклик sendto() може блокуватися, якщо в мережному буфері не вистачає місця для датаграми.

Для читання прийнятих датаграм і визначення адреси одержувача (при необхідності) служить системний виклик recvfrom(). До числа параметрів цього виклику входять:

  • Дескриптор сокета, через який приймається датаграма.
  • Адреса області пам'яті, куди слід покласти дані, складові змістовну частину датаграми.
  • Максимальна довжина, допустима для датаграми. Якщо кількість даних датаграми перевищує задану максимальну довжину, то виклик за умовчанням розглядає це як помилкову ситуацію.
  • Прапори, що визначають поведінку системного виклику (в нашому випадку вони вважатимуться рівними 0).
  • Покажчик на структуру, в яку при необхідності може бути занесена адреса сокета відправника. Якщо ця адреса не потрібна, то можна вказати значення NULL.
  • Покажчик на змінну, що містить максимально можливу довжину адреси відправника. Після повернення з системного виклику в неї буде занесена фактична довжина структури, що містить адресу відправника. Якщо попередній параметр має значення NULL, то і цей параметр може мати значення NULL.

Системний виклик recvfrom() за умовчанням блокується, якщо відсутні прийняті датаграми, до тих пір, поки датаграма не з'явиться. При виникненні помилки він повертає негативне значення, при нормальній роботі – довжину прийнятої датаграми.

Системні виклики sendto і recvfrom

Прототипи системних викликів

#include <sys/types.h>#include <sys/socket.h> int sendto(int sockd, char *buff int nbytes, int flags struct sockaddr *to, int addrlen);int recvfrom(int sockd, char *buff int nbytes, int flags struct sockaddr *from, int *addrlen);

Опис системних викликів

Системний виклик sendto призначений для відправки датаграм. Системний виклик recvfrom призначений для читання датаграм і визначення адреси відправника, що прийшли. За умовчанням за відсутності датаграм, що прийшли, виклик recvfrom блокується до тих пір, поки не з'явиться датаграма. Виклик sendto може блокуватися за відсутності місця під датаграму в мережному буфері. Даний опис не є повним описом системних викликів, а призначено тільки для використовування в нашому курсі. За повною інформацією звертайтеся до UNIX Manual.

Параметр sockd є дескриптором створеного раніше сокета, тобто значенням, поверненим системним викликом socket(), через який відсилатиметься або виходитиме інформація.

Параметр buff є адресою області пам'яті, починаючи з якою братиметься інформація для передачі або розміщуватиметься прийнята інформація.

Параметр nbytes для системного виклику sendto визначає кількість байт, яке повинне бути передано, починаючи з адресою пам'яті buff. Параметр nbytes для системного виклику recvfrom визначає максимальну кількість байт, яке може бути розміщене в приймальному буфері, починаючи з адресою buff.

Параметр to для системного виклику sendto визначає посилання на структуру, що містить адресу сокета одержувача інформації, яка повинна бути заповнена перед викликом. Якщо параметр from для системного виклику recvfrom не рівний NULL, то для випадку встановлення зв'язку через пакети даних він визначає посилання на структуру, в яку буде занесена адреса сокета відправника інформації після завершення виклику. В цьому випадку перед викликом цю структуру необхідно обнулити.

Параметр addrlen для системного виклику sendto повинен містити фактичну довжину структури, адреса якої передається як параметр to. Для системного виклику recvfrom параметр addrlen є посиланням на змінну, в яку буде занесена фактична довжина структури адреси сокета відправника, якщо це визначено параметром from. Помітимо, що перед викликом цей параметр повинен указувати на змінну, що містить максимально допустиме значення такої довжини. Якщо параметр from має значення NULL, то і параметр addrlen може мати значення NULL.

Параметр flags визначає режими використовування системних викликів. Розглядати його вживання ми в даному курсі не будемо, і тому беремо значення цього параметра рівним 0.

Значення, що повертається

У разі успішного завершення системний виклик повертає кількість реально відісланих або прийнятих байт. При виникненні якої-небудь помилки повертається негативне значення.



Поделиться:


Последнее изменение этой страницы: 2017-01-20; просмотров: 160; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.239.110 (0.006 с.)