Sendto что это за программа

Семейство протоколов TCP/IP. Сокеты (sockets) в UNIX и основы работы с ними

Для отправки датаграмм применяется системный вызов sendto() . В число параметров этого вызова входят:

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

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

Как зарабатывать на крипте /Прямой эфир/ Ответы на вопросы / Что купить сегодня?

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

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

Системный вызов recvfrom() по умолчанию блокируется, если отсутствуют принятые датаграммы , до тех пор, пока датаграмма не появится. При возникновении ошибки он возвращает отрицательное значение , при нормальной работе – длину принятой датаграммы .

Системные вызовы sendto и recvfrom

Прототипы системных вызовов

#include #include 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.

SEO за 1 час!

Параметр 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 .

Возвращаемое значение

В случае успешного завершения системный вызов возвращает количество реально отосланных или принятых байт. При возникновении какой-либо ошибки возвращается отрицательное значение.

Определение IP-адресов для вычислительного комплекса

Для определения IP-адресов на компьютере можно воспользоваться утилитой /sbin/ifconfig . Эта утилита выдает всю информацию о сетевых интерфейсах, сконфигурированных в вычислительной системе. Пример выдачи утилиты показан ниже:

eth0 Link encap:Ethernet HWaddr 00:90:27:A7:1B:FE inet addr:192.168.253.12 Bcast:192.168.253.255 Mask:255.255.255.0 UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 RX packets:122556059 errors:0 dropped:0 overruns:0 frame:0 TX packets:116085111 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:2240402748 (2136.6 Mb) TX bytes:3057496950 (2915.8 Mb) Interrupt:10 Base address:0x1000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:403 errors:0 dropped:0 overruns:0 frame:0 TX packets:403 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:39932 (38.9 Kb) TX bytes:39932 (38.9 Kb)
Пример 15-16.0. Информация о сетевых интерфейсах.

Сетевой интерфейс eth0 использует протокол Ethernet . Физический 48-битовый адрес , зашитый в сетевой карте, – 00:90:27:A7:1B:FE . Его IP-адрес – 192.168.253.12 .

Сетевой интерфейс lo не относится ни к какой сетевой карте. Это так называемый локальный интерфейс , который через общую память эмулирует работу сетевой карты для взаимодействия процессов, находящихся на одной машине по полным сетевым адресам. Наличие этого интерфейса позволяет отлаживать сетевые программы на машинах, не имеющих сетевых карт. Его IP-адрес обычно одинаков на всех компьютерах – 127.0.0.1 .

Пример программы UDP-клиента

Рассмотрим, наконец, простой пример программы 15–16-1.с . Эта программа является UDP -клиентом для стандартного системного сервиса echo . Стандартный сервис принимает от клиента текстовую датаграмму и, не изменяя ее, отправляет обратно. За сервисом зарезервирован номер порта 7. Для правильного запуска программы необходимо указать символьный IP-адрес сетевого интерфейса компьютера, к сервису которого нужно обратиться, в качестве аргумента командной строки, например:

a.out 192.168.253.12

Ниже следует текст программы

/* Простой пример UDP клиента для сервиса echo */ #include #include #include #include #include #include #include #include int main(int argc, char **argv) < int sockfd; /* Дескриптор сокета */ int n, len; /* Переменные для различных длин и количества символов */ char sendline[1000], recvline[1000]; /* Массивы для отсылаемой и принятой строки */ struct sockaddr_in servaddr, cliaddr; /* Структуры для адресов сервера и клиента */ /* Сначала проверяем наличие второго аргумента в командной строке. При его отсутствии ругаемся и прекращаем работу */ if(argc != 2)< printf(«Usage: a.out n»); exit(1); > /* Создаем UDP сокет */ if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)< perror(NULL); /* Печатаем сообщение об ошибке */ exit(1); >/* Заполняем структуру для адреса клиента: семейство протоколов TCP/IP, сетевой интерфейс – любой, номер порта по усмотрению операционной системы.

Читайте также:
Оракл программа что это такое простыми

Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero( cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(0); cliaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Настраиваем адрес сокета */ if(bind(sockfd, (struct sockaddr *) 0)< perror(NULL); close(sockfd); /* По окончании работы закрываем дескриптор сокета */ exit(1); >/* Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – из аргумента командной строки, номер порта 7. Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero( servaddr.sin_family = AF_INET; servaddr.sin_port = htons(7); if(inet_aton(argv[1], printf(«Invalid IP addressn»); close(sockfd); /* По окончании работы закрываем дескриптор сокета */ exit(1); >/* Вводим строку, которую отошлем серверу */ printf(«String => «); fgets(sendline, 1000, stdin); /* Отсылаем датаграмму */ if(sendto(sockfd, sendline, strlen(sendline)+1, 0, (struct sockaddr *) 0)< perror(NULL); close(sockfd); exit(1); >/* Ожидаем ответа и читаем его. Максимальная допустимая длина датаграммы – 1000 символов, адрес отправителя нам не нужен */ if((n = recvfrom(sockfd, recvline, 1000, 0, (struct sockaddr *) NULL, NULL)) < 0)< perror(NULL); close(sockfd); exit(1); >/* Печатаем пришедший ответ и закрываем сокет */ printf(«%sn», recvline); close(sockfd); return 0; >

Листинг 15-16.1. Программа 15–16-1.c . Простой пример UDP клиента для сервиса echo.

Наберите и откомпилируйте программу. Перед запуском «узнайте у своего системного администратора», запущен ли в системе стандартный UDP -сервис echo и если нет, попросите стартовать его. Запустите программу с запросом к сервису своего компьютера, к сервисам других компьютеров.

Если в качестве IP-адреса указать несуществующий адрес , адрес выключенной машины или машины, на которой не работает сервис echo , то программа бесконечно блокируется в вызове recvfrom() , ожидая ответа. Протокол UDP не является надежным протоколом. Если датаграмму доставить по назначению не удалось, то отправитель никогда об этом не узнает!

Пример программы UDP-сервера

Поскольку UDP — сервер использует те же самые системные вызовы, что и UDP -клиент, мы можем сразу приступить к рассмотрению примера UDP -сервера ( программа 15–16-2.с ) для сервиса echo .

/* Простой пример UDP-сервера для сервиса echo */ #include #include #include #include #include #include #include #include int main() < int sockfd; /* Дескриптор сокета */ int clilen, n; /* Переменные для различных длин и количества символов */ char line[1000]; /* Массив для принятой и отсылаемой строки */ struct sockaddr_in servaddr, cliaddr; /* Структуры для адресов сервера и клиента */ /* Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – любой, номер порта 51000. Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero( servaddr.sin_family = AF_INET; servaddr.sin_port = htons(51000); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Создаем UDP сокет */ if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)< perror(NULL); /* Печатаем сообщение об ошибке */ exit(1); >/* Настраиваем адрес сокета */ if(bind(sockfd, (struct sockaddr *) 0)< perror(NULL); close(sockfd); exit(1); >while(1) < /* Основной цикл обслуживания*/ /* В переменную clilen заносим максимальную длину для ожидаемого адреса клиента */ clilen = sizeof(cliaddr); /* Ожидаем прихода запроса от клиента и читаем его.

Максимальная допустимая длина датаграммы – 999 символов, адрес отправителя помещаем в структуру cliaddr, его реальная длина будет занесена в переменную clilen */ if((n = recvfrom(sockfd, line, 999, 0, (struct sockaddr *) clilen)) < 0)< perror(NULL); close(sockfd); exit(1); >/* Печатаем принятый текст на экране */ printf(«%sn», line); /* Принятый текст отправляем обратно по адресу отправителя */ if(sendto(sockfd, line, strlen(line), 0, (struct sockaddr *) 0)< perror(NULL); close(sockfd); exit(1); >/* Уходим ожидать новую датаграмму*/ > return 0; >
Листинг 15-16.2.

Программа 15–16-2.c . Простой пример UDP-сервера для сервиса echo.

Наберите и откомпилируйте программу. Запустите ее на выполнение. Модифицируйте текст программы UDP -клиента (программа 15–16-1.c ), заменив номер порта с 7 на 51000. Запустите клиента с другого виртуального терминала или с другого компьютера и убедитесь, что клиент и сервер взаимодействуют корректно.

Источник: intuit.ru

Sendto что это за программа

ssize_t send(int s , const void * msg , size_t len , int flags );
ssize_t sendto(int s , const void * msg , size_t len , int flags , const struct sockaddr * to , socklen_t tolen );
ssize_t sendmsg(int s , const struct msghdr * msg , int flags );

ОПИСАНИЕ

send , sendto , и sendmsg используются для пересылки сообщений в другой сокет. send можно использовать, только если сокет находится в состоянии соединения , тогда как sendto и sendmsg можно использовать в любое время.

Адрес получателя задается параметром to длиной tolen . Длина сообщения задается параметром len . Если сообщение слишком длинное, чтобы быть отосланным протоколом нижнего уровня, возвращается ошибка EMSGSIZE , а сообщение не отсылается.

Неудачная отправка не показывается
с помощью send . Локальные ошибки принимают значение -1.

Когда сообщение не помещается в буфер отправки сокета, send обычно дожидается завершения отправки, если только сокет не находится в неблокирующем режиме. Если сокет находится в неблокирующем режиме, то в этом случае возвращается EAGAIN . Системный вызов select (2) можно использовать для выяснения, возможно ли отправлять данные.

Параметр flags является битовой маской и может содержать такие флаги: MSG_OOB Посылает внепотоковые данные, если сокет это поддерживает (как, например, сокеты типа SOCK_STREAM ); протокол более низкого уровня также должен поддерживать внепотоковые данные. MSG_DONTROUTE Не использовать маршрутизацию при отправке пакета, а посылать его только на хосты в локальной сети.

Обычно это используется в диагностических программах и программах маршрутизации. Этот флаг определен только для маршрутизируемых семейств протоколов; пакетные сокеты не используют маршрутизацию. MSG_DONTWAIT Включает режим non-blocking; если операция должна была заблокировать программу, возвращается EAGAIN (этот режим также можно задать с помощью опции O_NONBLOCK , команды F_SETFL и функции fcntl (2)).

MSG_NOSIGNAL Требует не посылать сигнал SIGPIPE , если при работе с ориентированным на поток сокетом другая сторона обрывает соединение. Код ошибки EPIPE возвращается в любом случае. MSG_CONFIRM (только в Linux 2.3+) Сообщает (на уровне связи), что процесс пересылки произошел: вы получаете успешный ответ с другой стороны.

Если уровень связи не получает его, он регулярно перепроверяет сеть (например посредством однонаправленной передачи ARP). Это работает с сокетами SOCK_DGRAM и SOCK_RAW и в настоящее время реализовано для IPv4 и IPv6. См. arp (7) для более подробной информации.

Определение структуры msghdr описано в recv (2) и ниже с описаниями полей.

struct msghdr < void * msg_name; /* необязательный адрес */ socklen_t msg_namelen; /* размер адреса */ struct iovec * msg_iov; /* массив scatter/gather */ size_t msg_iovlen; /* количество элементов в msg_iov */ void * msg_control; /* вспомогательные данные, см. ниже */ socklen_t msg_controllen; /* длина буфера вспомогательных данных */ int msg_flags; /* флаги принятого сообщения */ >;

Читайте также:
D back что за программа

Управляющую информацию можно посылать с помощью компонентов msg_control и msg_controllen . Максимальная длина управляющего буфера, которую поддерживает ядро, ограничена значением net.core.optmem_max ; см. socket (7).

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

Эти системные вызовы возвращают количество отправленных символов или -1, если произошла ошибка.

НАЙДЕННЫЕ ОШИБКИ

Есть несколько стандартных ошибок, генерируемых на уровне сокетов. Модули протоколов более низкого уровня могут также возвращать дополнительные коды ошибок; смотри соответствующие страницы руководства. EBADF Указан неверный описатель. ENOTSOCK Аргумент s не является сокетом. EFAULT В качестве параметра передан неверный адрес.

EMSGSIZE Сокет требует, чтобы сообщение было отослано за время одной операции (атомарно), а размер сообщения не позволяет этого. EAGAIN или EWOULDBLOCK Сокет помечен как non-blocking, а запрошенная операция должна была заблокировать его. ENOBUFS Исходящая очередь сетевого интерфейса заполнена.

Обычно это означает, что интерфейс прекратил отправку, но это может быть также вызвано временной перегрузкой системы. (Этого не может произойти в Linux, потому что пакеты в этой системе просто «отбрасываются», когда очередь устройства переполняется.) EINTR Поступил соответствующий сигнал. ENOMEM Недостаточно памяти в системе. EINVAL Передан неверный аргумент. EPIPE Локальный сокет, ориентированный на соединение, был закрыт. В этом случае процесс также получит сигнал SIGPIPE , если только не установлен флаг MSG_NOSIGNAL .

СООТВЕТСТВИЕ СТАНДАРТАМ

4.4BSD, SVr4, POSIX 1003.1g draft (эти системные вызовы появились в 4.2BSD). MSG_CONFIRM является расширением для Linux.

ЗАМЕЧАНИЯ

Вышеприведенные прототипы соответствуют прототипам glibc2. Single Unix Specification согласен с ними, за исключением того, что в этом стандарте возвращаемые значения определены как ssize_t (тогда как в BSD 4.x, libc4 и libc5 они определены как int). Аргумент flags является int в BSD 4.x, но unsigned int в libc4 и libc5. Аргумент len является int в BSD 4.x, но size_t в libc4 и libc5. Аргумент fromlen является int * в BSD 4.x, libc4 и libc5.

См. также accept (2).

Источник: www.opennet.ru

Как добавить и удалить пункты меню «Отправить» в Windows 10, 8 и 7

Как редактировать меню Отправить в Windows

При нажатии правой кнопкой мыши по файлу или папке в открывшемся контекстном меню присутствует пункт «Отправить», позволяющий быстро создать ярлык на рабочем столе, скопировать файл на флешку, добавить данные в ZIP-архив. При желании, вы можете добавить свои пункты в меню «Отправить» или удалить уже имеющиеся, а также, если требуется — изменить иконки этих пунктов, о чем и пойдет речь в инструкции.

Как удалить или добавить пункт в контекстное меню «Отправить» в проводнике

Основные пункты контекстного меню «Отправить» в Windows 10, 8 и 7 хранятся в специальной папке C:Usersимя_пользователяAppDataRoamingMicrosoftWindowsSendTo

При желании, вы можете удалить отдельные пункты из этой папки или добавить собственные ярлыки, которые появятся в меню «Отправить». К примеру, если вы хотите добавить пункт для отправки файла в блокнот, шаги будут следующими:

Папка с иконками меню Отправить

  1. В проводнике введите в адресную строку shell:sendto и нажмите Enter (это автоматически переведет вас в указанную выше папку).
  2. В пустом месте папки нажмите правой кнопкой мыши — создать — ярлык — notepad.exe и укажите имя «Блокнот». При необходимости вы можете создать ярлык на папку для быстрой отправки файлов в эту папку с помощью меню.
  3. Сохраните ярлык, соответствующий пункт в меню «Отправить» появится сразу, без перезагрузки компьютера.

При желании, вы можете изменить ярлыки имеющихся (но в данном случае — не всех, только для тех, которые являются ярлыками с соответствующей стрелочкой у значка) пунктов меню в свойствах ярлыков.

Для изменения иконок других пунктов меню вы можете использовать редактор реестра:

    Перейдите в раздел реестра

HKEY_CURRENT_USERSoftwareClassesCLSID

Изменение иконки для пункта меню Отправить

  • Создайте подраздел, соответствующий нужном пункту контекстного меню (список будет далее), а в нем — подраздел DefaultIcon.
  • Для значения «По умолчанию» укажите путь к иконке.
  • Перезагрузите компьютер или выйдите из Windows и снова зайдите.
  • Список имен подразделов для пунктов контекстного меню «Отправить»:

    • — Адресат
    • — Сжатая ZIP-папка
    • — Документы
    • — Рабочий стол (создать ярлык)

    Редактирование меню «Отправить» с помощью сторонних программ

    Существует достаточно большое количество бесплатных программ, позволяющих добавлять или удалять пункты из контекстного меню «Отправить». Среди тех, что можно рекомендовать — SendTo Menu Editor и Send To Toys, причем русский язык интерфейса поддерживается только в первой из них.

    SendTo Menu Editor не требует установки на компьютер и очень проста в использовании (не забудьте переключить язык на русский в Options — Languages): в ней вы можете удалить или отключить имеющиеся пункты, добавить новые, а через контекстное меню — изменить иконки или переименовать ярлыки.

    Программа SendTo Menu Editor

    Дополнительная информация

    Если вы хотите полностью удалить пункт «Отправить» в контекстном меню, используйте редактор реестра: перейдите к разделу

    HKEY_CLASSES_ROOTAllFilesystemObjectsshellexContextMenuHandlersSend To

    Очистите данные из значения «По умолчанию» и перезагрузите компьютер. И, наоборот, если пункт «Отправить» не отображается, убедитесь, что указанный раздел существует и значение по умолчанию установлено в

    А вдруг и это будет интересно:

    • Лучшие бесплатные программы для Windows
    • Как удалить обновления Windows 11
    • DISM Ошибка 87 в командной строке — способы исправить
    • Как убрать уведомление Chrome и Edge об обновлении Windows 7 и 8.1 до более поздней версии
    • Как включить скрытые темы оформления Windows 11 22H2
    • Как сделать скриншот в Windows 11 — все способы
    • Windows 11
    • Windows 10
    • Android
    • Загрузочная флешка
    • Лечение вирусов
    • Восстановление данных
    • Установка с флешки
    • Настройка роутера
    • Всё про Windows
    • В контакте
    • Одноклассники
      Антон 22.12.2018 в 06:52
    • Dmitry 14.08.2019 в 15:46

    Источник: remontka.pro

    Функция sendto (winsock2.h)

    Функция sendto отправляет данные в определенное место назначения.

    Синтаксис

    int WSAAPI sendto( [in] SOCKET s, [in] const char *buf, [in] int len, [in] int flags, [in] const sockaddr *to, [in] int tolen );

    Параметры

    Дескриптор, определяющий сокет (возможно, подключенный).

    Указатель на буфер, содержащий передаваемые данные.

    Длина данных в байтах, на которые указывает параметр buf .

    Набор флагов, указывающий способ, с помощью которого выполняется вызов.

    Необязательный указатель на структуру sockaddr , содержащую адрес целевого сокета.

    Размер адреса в байтах, на который указывает параметр.

    Возвращаемое значение

    Если ошибка не возникает, sendto возвращает общее число отправленных байтов, которое может быть меньше числа, указанного в len. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить путем вызова WSAGetLastError.

    Код ошибки Значение
    WSANOTINITIALISED Перед использованием этой функции должен произойти успешный вызов WSAStartup .
    WSAENETDOWN Сбой сетевой подсистемы.
    WSAEACCES Запрошенный адрес является широковещательным адресом, но соответствующий флаг не задан. Вызов setsockopt с параметром SO_BROADCAST, чтобы разрешить использование широковещательного адреса.
    WSAEINVAL Был указан неизвестный флаг или MSG_OOB был указан для сокета с включенным SO_OOBINLINE.
    WSAEINTR Блокировка вызова Сокетов Windows 1.1 была отменена через WSACancelBlockingCall.
    WSAEINPROGRESS Выполняется блокирующий вызов Сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
    WSAEFAULT Bufили параметры не являются частью адресного пространства пользователя, или параметр tolen слишком мал.
    WSAENETRESET Подключение было нарушено из-за активности действия, обнаруживающего сбой во время выполнения операции.
    WSAENOBUFS Нет свободного места в буфере.
    WSAENOTCONN Сокет не подключен (только сокеты, ориентированные на подключение).
    WSAENOTSOCK Дескриптор не является сокетом.
    WSAEOPNOTSUPP MSG_OOB указан, но сокет не является потоковым стилем, например типом SOCK_STREAM, данные OOB не поддерживаются в домене связи, связанном с этим сокетом, или сокет является однонаправленным и поддерживает только операции получения.
    WSAESHUTDOWN Сокет был выключен; Невозможно отправить данные в сокет после вызова завершения работы с настройкой SD_SEND или SD_BOTH.
    WSAEWOULDBLOCK Сокет помечен как неблокировочный, и запрошенная операция будет блокироваться.
    WSAEMSGSIZE Сокет ориентирован на сообщение, и сообщение больше максимального, поддерживаемого базовым транспортом.
    WSAEHOSTUNREACH В настоящее время удаленный узел не может быть достигнут из этого узла.
    WSAECONNABORTED Виртуальное подключение разорвано из-за тайм-аута или иного сбоя. Приложение должно закрыть сокет, поскольку он больше не может использоваться.
    WSAECONNRESET Виртуальное подключение было сброшено удаленной стороной путем прерывания. Для сокетов UPD удаленный узел не смог доставить ранее отправленную датаграмму UDP и ответил с помощью пакета ICMP port unreachable. Приложение должно закрыть сокет, поскольку он больше не может использоваться.
    WSAEADDRNOTAVAIL Удаленный адрес не является допустимым, например ADDR_ANY.
    WSAEAFNOSUPPORT Адреса из заданного семейства адресов не могут использоваться с этим сокетом.
    WSAEDESTADDRREQ Требуется адрес назначения.
    WSAENETUNREACH В настоящее время сеть недоступна с этого узла.
    WSAEHOSTUNREACH Сделана попытка выполнить операцию на сокете для недоступного хоста.
    WSAETIMEDOUT Подключение было удалено из-за сбоя сети или из-за того, что система на другом конце была отключена без уведомления.
    Читайте также:
    Dvd creaTor что это за программа

    Комментарии

    Функция sendto используется для записи исходящих данных в сокет. Для сокетов, ориентированных на сообщения, необходимо соблюдать осторожность, чтобы не превышать максимальный размер пакета базовых подсетей, которые можно получить с помощью getsockopt для получения значения параметра сокета SO_MAX_MSG_SIZE. Если данные слишком длинны для атомарного прохождения через базовый протокол, возвращается ошибка WSAEMSGSIZE и данные не передаются.

    Параметр to может быть любым допустимым адресом в семействе адресов сокета, включая широковещательный или любой адрес многоадресной рассылки. Для отправки на широковещательный адрес приложение должно использовать setsockopt с включенным SO_BROADCAST. В противном случае sendto завершится ошибкой с кодом WSAEACCES. Для TCP/IP приложение может отправлять данные на любой адрес многоадресной рассылки (не став членом группы).

    Примечание Если сокет открыт, выполняется вызов setsockopt , а затем выполняется вызов sendto , сокеты Windows выполняют неявный вызов функции привязки .

    Если сокет не связан, система присваивает уникальные значения локальной связи, а затем сокет помечается как привязанный. Если сокет подключен, функцию getsockname можно использовать для определения локального IP-адреса и порта, связанного с сокетом.

    Если сокет не подключен,
    Функцию getockname можно использовать для определения номера локального порта, связанного с сокетом, но возвращенный IP-адрес имеет подстановочный знак для заданного протокола (например, INADDR_ANY или «0.0.0.0» для IPv4 и IN6ADDR_ANY_INIT или «::» для IPv6).

    Успешное завершение отправки не указывает, что данные были успешно доставлены.

    Функция sendto обычно используется в сокете без подключения для отправки датаграммы в конкретный одноранговый сокет, определенный параметром . Даже если сокет без подключения ранее был подключен к определенному адресу, параметр переопределяет адрес назначения только для конкретной датаграммы. В сокете, ориентированном на подключение, параметры to и tolen игнорируются, что делает отправку эквивалентной отправки sendto.

    Примечание При выполнении блокирующего вызова Winsock, например sendto, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. Winsock выполняет оповещенное ожидание в этой ситуации, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в одном потоке. Выдача другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению и никогда не должен пытаться клиентами Winsock.

    Пример кода

    В следующем примере показано использование функции sendto .

    #ifndef UNICODE #define UNICODE #endif #define WIN32_LEAN_AND_MEAN #include #include #include // Link with ws2_32.lib #pragma comment(lib, «Ws2_32.lib») int main() < int iResult; WSADATA wsaData; SOCKET SendSocket = INVALID_SOCKET; sockaddr_in RecvAddr; unsigned short Port = 27015; char SendBuf[1024]; int BufLen = 1024; //———————- // Initialize Winsock iResult = WSAStartup(MAKEWORD(2, 2), if (iResult != NO_ERROR) < wprintf(L»WSAStartup failed with error: %dn», iResult); return 1; >//——————————————— // Create a socket for sending data SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (SendSocket == INVALID_SOCKET) < wprintf(L»socket failed with error: %ldn», WSAGetLastError()); WSACleanup(); return 1; >//——————————————— // Set up the RecvAddr structure with the IP address of // the receiver (in this example case «192.168.1.1») // and the specified port number. RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(Port); RecvAddr.sin_addr.s_addr = inet_addr(«192.168.1.1″); //——————————————— // Send a datagram to the receiver wprintf(L»Sending a datagram to the receiver. n»); iResult = sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) if (iResult == SOCKET_ERROR) < wprintf(L»sendto failed with error: %dn», WSAGetLastError()); closesocket(SendSocket); WSACleanup(); return 1; >//——————————————— // When the application is finished sending, close the socket. wprintf(L»Finished sending.

    Closing socket.n»); iResult = closesocket(SendSocket); if (iResult == SOCKET_ERROR) < wprintf(L»closesocket failed with error: %dn», WSAGetLastError()); WSACleanup(); return 1; >//——————————————— // Clean up and quit. wprintf(L»Exiting.n»); WSACleanup(); return 0; >

    Для сокетов с использованием IP-адреса (версия 4)

    Для отправки широковещательной передачи (только на SOCK_DGRAM), адрес, на который указывает параметр to , можно создать так, чтобы он содержал специальный IPv4-адрес INADDR_BROADCAST (определенный в Winsock2.h) вместе с предполагаемым номером порта. Если адрес, на который указывает параметр to , содержит адрес INADDR_BROADCAST и предполагаемый порт, трансляция будет отправлена на все интерфейсы этого порта.

    Если широковещательная передача должна отправляться только в определенном интерфейсе, то адрес, на который указывает параметр to , должен содержать адрес широковещательной передачи подсети для интерфейса и предполагаемый порт. Например, сетевой адрес IPv4 192.168.1.0 с маской подсети 255.255.255.0 будет использовать широковещательный адрес подсети 192.168.1.255.

    Обычно для широковещательной датаграммы может превышать размер фрагментации, что означает, что часть данных датаграммы (за исключением заголовков) не должна превышать 512 байт.

    Если буферное пространство не доступно в транспортной системе для хранения передаваемых данных, sendto будет блокироваться, если сокет не был помещен в неблокировочный режим. При неблокировке сокетов, ориентированных на поток, число записанных байтов может быть от 1 до запрошенной длины в зависимости от доступности буфера как в клиентских, так и серверных системах. Функцию select, WSAsyncSelect или WSAEventSelect можно использовать для определения возможности отправки дополнительных данных.

    Вызов sendto с len нулевой допустимой и возвратит ноль в качестве допустимого значения. Для сокетов, ориентированных на сообщения, отправляется датаграмма транспорта нулевой длины.

    Параметр флагов можно использовать для влияния на поведение вызова функции за пределами параметров, указанных для связанного сокета. Семантика этой функции определяется параметрами сокета и параметром флагов . Последний создается с помощью побитового оператора OR со следующими значениями.

    Значение Значение
    MSG_DONTROUTE Указывает, что данные не должны подвергаться маршрутизации. Поставщик услуг сокетов Windows может игнорировать этот флаг.
    MSG_OOB Отправляет данные OOB (сокет в стиле потока, например только SOCK_STREAM).

    Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone в Windows Phone 8 и более поздних версий.

    Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версий.

    Требования

    Минимальная версия клиента Windows 8.1, Windows Vista [классические приложения | Приложения UWP]
    Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
    Целевая платформа Windows
    Header winsock2.h (включая Winsock2.h)
    Библиотека Ws2_32.lib
    DLL Ws2_32.dll

    Источник: learn.microsoft.com

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru