Sendto

sendto function (winsock.h) – Win32 apps

Sendto

  • 12/05/2018
  • 8 minutes to read

Thesendto function sends data to a specific destination.

Syntax

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

Parameters

s

A descriptor identifying a (possibly connected) socket.

buf

A pointer to a buffer containing the data to be transmitted.

len

The length, in bytes, of the data pointed to by the buf parameter.

flags

A set of flags that specify the way in which the call is made.

to

An optional pointer to asockaddr structure that contains the address of the target socket.

tolen

The size, in bytes, of the address pointed to by the to parameter.

Return value

If no error occurs,sendto returns the total number of bytes sent, which can be less than the number indicated by len. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by callingWSAGetLastError.

Error codeMeaning
WSANOTINITIALISEDA successful WSAStartup call must occur before using this function.
WSAENETDOWNThe network subsystem has failed.
WSAEACCESThe requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST parameter to allow the use of the broadcast address.
WSAEINVALAn unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.
WSAEINTRA blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.
WSAEINPROGRESSA blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAEFAULTThe buf or to parameters are not part of the user address space, or the tolen parameter is too small.
WSAENETRESETThe connection has been broken due to keep-alive activity detecting a failure while the operation was in progress.
WSAENOBUFSNo buffer space is available.
WSAENOTCONNThe socket is not connected (connection-oriented sockets only).
WSAENOTSOCKThe descriptor is not a socket.
WSAEOPNOTSUPPMSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
WSAESHUTDOWNThe socket has been shut down; it is not possible to sendto on a socket after shutdown has been invoked with how set to SD_SEND or SD_BOTH.
WSAEWOULDBLOCKThe socket is marked as nonblocking and the requested operation would block.
WSAEMSGSIZEThe socket is message oriented, and the message is larger than the maximum supported by the underlying transport.
WSAEHOSTUNREACHThe remote host cannot be reached from this host at this time.
WSAECONNABORTEDThe virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no longer usable.
WSAECONNRESETThe virtual circuit was reset by the remote side executing a hard or abortive close. For UPD sockets, the remote host was unable to deliver a previously sent UDP datagram and responded with a “Port Unreachable” ICMP packet. The application should close the socket as it is no longer usable.
WSAEADDRNOTAVAILThe remote address is not a valid address, for example, ADDR_ANY.
WSAEAFNOSUPPORTAddresses in the specified family cannot be used with this socket.
WSAEDESTADDRREQA destination address is required.
WSAENETUNREACHThe network cannot be reached from this host at this time.
WSAEHOSTUNREACHA socket operation was attempted to an unreachable host.
WSAETIMEDOUTThe connection has been dropped, because of a network failure or because the system on the other end went down without notice.

Thesendto function is used to write outgoing data on a socket.

For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying subnets, which can be obtained by usinggetsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE.

If the data is too long to pass atomically through the underlying protocol, the errorWSAEMSGSIZE is returned and no data is transmitted.

The to parameter can be any valid address in the socket's address family, including a broadcast or any multicast address. To send to a broadcast address, an application must have usedsetsockopt with SO_BROADCAST enabled. Otherwise,sendto will fail with the error codeWSAEACCES. For TCP/IP, an application can send to any multicast address (without becoming a group member).

Note  If a socket is opened, a setsockopt call is made, and then a sendto call is made, Windows Sockets performs an implicit bind function call. If the socket is unbound, unique values are assigned to the local association by the system, and the socket is then marked as bound. If the socket is connected, the getsockname function can be used to determine the local IP address and port associated with the socket. If the socket is not connected, the
getsockname function can be used to determine the local port number associated with the socket but the IP address returned is set to the wildcard address for the given protocol (for example, INADDR_ANY or “0.0.0.0” for IPv4 and IN6ADDR_ANY_INIT or “::” for IPv6).

The successful completion of asendto does not indicate that the data was successfully delivered.

Thesendto function is normally used on a connectionless socket to send a datagram to a specific peer socket identified by the to parameter.

Even if the connectionless socket has been previously connected to a specific address, the to parameter overrides the destination address for that particular datagram only.

On a connection-oriented socket, the to and tolen parameters are ignored, makingsendto equivalent tosend.

Note  When issuing a blocking Winsock call such as sendto, Winsock may need to wait for a network event before the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.

Example Code

The following example demonstrates the use of the sendto function.#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), &wsaData); if (iResult != NO_ERROR) { wprintf(L”WSAStartup failed with error: %d”, 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: %ld”, 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…”); iResult = sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr)); if (iResult == SOCKET_ERROR) { wprintf(L”sendto failed with error: %d”, WSAGetLastError()); closesocket(SendSocket); WSACleanup(); return 1; } //——————————————— // When the application is finished sending, close the socket. wprintf(L”Finished sending. Closing socket.”); iResult = closesocket(SendSocket); if (iResult == SOCKET_ERROR) { wprintf(L”closesocket failed with error: %d”, WSAGetLastError()); WSACleanup(); return 1; } //——————————————— // Clean up and quit. wprintf(L”Exiting.”); WSACleanup(); return 0;}

For Sockets Using IP (Version 4)

To send a broadcast (on a SOCK_DGRAM only), the address pointed to by the to parameter can be constructed to contain the special IPv4 address INADDR_BROADCAST (defined in Winsock2.h), together with the intended port number.

If the address pointed to by the to parameter contains the INADDR_BROADCAST address and intended port, then the broadcast will be sent out on all interfaces to that port.

If the broadcast should be sent out only on a specific interface, then the address pointed to by the to parameter should contain the subnet broadcast address for the interface and the intended port. For example, an IPv4 network address of 192.168.1.0 with a subnet mask of 255.255.255.0 would use a subnet broadcast address of 192.168.1.255.

It is generally inadvisable for a broadcast datagram to exceed the size at which fragmentation can occur, which implies that the data portion of the datagram (excluding headers) should not exceed 512 bytes.

If no buffer space is available within the transport system to hold the data to be transmitted,sendto will block unless the socket has been placed in a nonblocking mode.

On nonblocking, stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server systems.

Theselect,WSAAsyncSelect orWSAEventSelect function can be used to determine when it is possible to send more data.

Callingsendto with a len of zero is permissible and will return zero as a valid value. For message-oriented sockets, a zero-length transport datagram is sent.

The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the associated socket. The semantics of this function are determined by the socket options and the flags parameter. The latter is constructed by using the bitwise OR operator with any of the following values.

ValueMeaning
MSG_DONTROUTESpecifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.
MSG_OOBSends OOB data (stream-style socket such as SOCK_STREAM only).

 

Windows Phone 8: This function is supported for Windows Phone Store apps on Windows Phone 8 and later.

Windows 8.1 and Windows Server 2012 R2: This function is supported for Windows Store apps on Windows 8.1, Windows Server 2012 R2, and later.

Requirements

Minimum supported clientWindows 8.1, Windows Vista [desktop apps | UWP apps]
Minimum supported serverWindows Server 2003 [desktop apps | UWP apps]
Target PlatformWindows
Headerwinsock.h (include Winsock2.h)
LibraryWs2_32.lib
DLLWs2_32.dll

See also

WSAAsyncSelect

WSAEventSelect

Winsock Functions

Winsock Reference

recv

recvfrom

select

send

socket

Источник: https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-sendto

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

Sendto

Для отправки датаграмм применяется системный вызов 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.Параметр 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-адресов на компьютере можно воспользоваться утилитой /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.

Рассмотрим, наконец, простой пример программы 15–16-1.с. Эта программа является UDP-клиентом для стандартного системного сервиса echo. Стандартный сервис принимает от клиента текстовую датаграмму и, не изменяя ее, отправляет обратно.

За сервисом зарезервирован номер порта 7.

Для правильного запуска программы необходимо указать символьный IP-адрес сетевого интерфейса компьютера, к сервису которого нужно обратиться, в качестве аргумента командной строки, например:

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

/* Простой пример 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 “); exit(1); } /* Создаем UDP сокет */ if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror(NULL); /* Печатаем сообщение об ошибке */ exit(1); } /* Заполняем структуру для адреса клиента: семейство протоколов TCP/IP, сетевой интерфейс – любой, номер порта по усмотрению операционной системы. Поскольку в структуре содержится дополнительное не нужное нам поле, которое должно быть нулевым, перед заполнением обнуляем ее всю */ bzero(&cliaddr, sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(0); cliaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Настраиваем адрес сокета */ if(bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0){ perror(NULL); close(sockfd); /* По окончании работы закрываем дескриптор сокета */ exit(1); } /* Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – из аргументакомандной строки, номер порта 7. Поскольку в структуре содержится дополнительное не нужное намполе, которое должно быть нулевым, перед заполнениемобнуляем ее всю */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(7); if(inet_aton(argv[1], &servaddr.sin_addr) == 0){ printf("Invalid IP address"); close(sockfd); /* По окончании работы закрываем дескриптор сокета */ exit(1); } /* Вводим строку, которую отошлем серверу */ printf("String => “); fgets(sendline, 1000, stdin); /* Отсылаем датаграмму */ if(sendto(sockfd, sendline, strlen(sendline)+1, 0, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 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("%s", recvline); close(sockfd); return 0;} Листинг 15-16.1. Программа 15–16-1.c . Простой пример UDP клиента для сервиса echo.

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

Если в качестве IP-адреса указать несуществующий адрес, адрес выключенной машины или машины, на которой не работает сервис echo, то программа бесконечно блокируется в вызове recvfrom() , ожидая ответа. Протокол 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, sizeof(servaddr)); 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 *) &servaddr, sizeof(servaddr)) < 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 *) &cliaddr, &clilen)) < 0){ perror(NULL); close(sockfd); exit(1); } /* Печатаем принятый текст на экране */ printf("%s", line); /* Принятый текст отправляем обратно по адресу отправителя */ if(sendto(sockfd, line, strlen(line), 0, (struct sockaddr *) &cliaddr, clilen) < 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. Запустите клиента с другого виртуального терминала или с другого компьютера и убедитесь, что клиент и сервер взаимодействуют корректно.

Источник: https://intuit.ru/studies/courses/2249/52/lecture/1567?page=7

Меню Отправить (Send To) в Windows 7

Sendto

Рассмотрим несколько приемов работы с меню Отправить в Windows 7.

Добавление новых команд в меню Отправить

Многим пользователям Windows знакома команда Отправить (Send To), которая присутствует в контекстом меню папок и файлов. Эта удобная команда позволяет щелчком мыши переместить выбранный файл или документ (или их группу) в часто используемые места расположения или выполнить какую-нибудь задачу. Например, с помоьщю этой команды можно:

  • скопировать файл в заданную папку на жёстком диске компьютера (например в папку Документы)
  • скопировать файлы на другие диски (например, на внешние жесткие диски или USB-флешки)
  • запустить нужную программу или ярлык
  • отправить документ по электронной почте
  • быстро скопировать файл на рабочий стол

Меню Отправить удобно использовать в таких случаях, когда часто приходится выполнять одни и те же операции с файлами. Например, если файлы ежедневно архивируются на другой компьютер в сети, то включите имя этого компьютера в меню Отправить — это позволит сэкономить вам массу времени.

Каждый пользователь системы может настроить меню Выполнить под себя. Для этого открываете папку SendTo и копируете нужные объекты (папку, программу, ярлык).

Например, с его помощью можно быстро открыть графический файл в нужной программе. Предположим, у вас установлена программа Adobe Photoshop и при двойном щелчке мыши на файле JPG в Проводнике у вас запускается эта программа (т.е.

запускается программа по умолчанию для данного расширения файла). Но если вы хотите посмотреть файл в другом графическом редакторе, например, в стандартном Paint, то скопируйте ярлык от нее в папку SendTo.

Теперь вам нужно вызвать контекстное меню файла и в меню Отправить выбрать команду Paint. Как видите, ничего сложного.

Новый путь к папке Отправить в Windows 7

Пользователям Windows XP нужно обратить внимание на следующий момент. В Windows XP папка SendTo находилась по адресу C:\Documents and Settings\UserName\SendTo. Начиная с Windows Vista, путь к этой папке изменился. Теперь ее надо искать по адресу

C:\Users\\AppData\Roaming\Microsoft\Windows\SendTo

Далее поступаете обычным способом – копируете в нее нужный объект (папку, программу, ярлыки), как было описано выше.

Не можете запомнить путь к папке, который стал очень длинным и труднозапоминаемым? Можно поступить проще. Чтобы не искать эту папку в недрах диска, наберите в строке поиска кнопки Пуск команду:

shell:sendto

В результате в Проводнике откроется нужная папка, в которой вы можете сделать нужные изменения.

Удаление папок, программ и ярлыков

Удаление папок, программ и ярлыков из папки Отправить является тривиальной задачей: выделяется нужный объект и удаляется клавишой Delete и командной Удалить из контекстного меню. После удаления ненужной папки или программы автоматически исчезает и соответствующий пункт в меню Отправить.

Удаление списка дисков

Многие пользователи используют команду Отправить для пересылки файлов по электронной почте, но редко используют для перенаправления файлов на другие диски. Поэтому список дисков является для многих лишним.

 А иногда этот список становиться слишком большим, если в системе установлен кард-ридер. Однако в папке Отправить (SendTo) записей, отвечающих за диски, не существует. Поэтому воспользуемся реестром.

В разделе

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

создайте параметр DWORD NoDrivesInSendToMenu со значением 1, либо воспользуйтесь готовым твиком реестра.

Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]“NoDrivesInSendToMenu”=dword:00000001После перезагрузки системы список дисков исчезнет из команды Отправить. Чтобы вернуть прежнее поведение команды, просто удалите созданный параметр (или присвойте ему значение 0).

Увеличить рисунок

Удаление команды Отправить

Последний прием предназначен только для опытных пользователей и позволяет удалить команду Отправить из системы. Снова откройте редактор реестра и присвойте пустое значение параметру по умолчанию в разделе

HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\SendTo

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

Источник: http://www.oszone.net/10575/SendTo

man sendto (2): отправляет сообщения в сокет

Sendto

sendto(2) отправляет сообщения в сокет

Other Alias

send, sendmsg

#include
#include

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); Системные вызовы send(), sendto() и sendmsg() используются дляпересылки сообщений в другой сокет.

Вызов send() можно использовать, только если сокет находится в состояниисоединения (то есть известен получатель). Вызов send() отличается отwrite(2) только наличием аргумента flags. Если значение flags равнонулю, то вызов send() эквивалентен write(2). Также, вызов

    send(sockfd, buf, len, flags);

эквивалентен

    sendto(sockfd, buf, len, flags, NULL, 0);

Аргумент sockfd представляет файловый дескриптор сокета отправления.

Если sendto() используется с сокетом в режиме с установлением соединения(SOCK_STREAM, SOCK_SEQPACKET), то аргументы dest_addr и addrlenигнорируются (и может быть возвращена ошибка EISCONN, если их значения неравны NULL и 0) и возвращается ошибка ENOTCONN, если соединение черезсокет не установлено. Иначе в dest_addr задаётся адрес назначения и егоразмер в addrlen. Для sendmsg() адрес назначения указывается вmsg.msg_name, а его размер в msg.msg_namelen.

У send() и sendto() сообщение находится в buf, а его длина вlen. У sendmsg() сообщение указывается в элементах массиваmsg.msg_iov. Вызов sendmsg() также позволяет отправлятьвспомогательные данные (так называемую управляющую информацию).

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

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

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

Аргумент flags является битовой маской и может содержать следующие флаги:MSG_CONFIRM (начиная с Linux 2.3.15)Сообщить уровню связи, что процесс пересылки произошел: вы получили успешныйответ с другой стороны. Если уровень связи не получит его, то он будетрегулярно перепроверять наличие ответной стороны (например посредствомоднонаправленной передачи ARP). Это работает только с сокетами SOCK_DGRAMи SOCK_RAW и в настоящее время реализовано только для IPv4 и IPv6. Вarp(7) представлена более подробная информация.MSG_DONTROUTEНе использовать маршрутизацию для отправки пакета, а посылать его только наузлы локальной сети. Обычно это используется в диагностических программах ипрограммах маршрутизации. Этот флаг определён только для маршрутизируемыхсемейств протоколов; пакетные сокеты не используют маршрутизацию.MSG_DONTWAIT (начиная с Linux 2.2)Включить неблокирующий режим. Если операция могла бы привести к блокировке,возвращается EAGAIN или EWOULDBLOCK. Такое поведение подобно заданиюфлага O_NONBLOCKfcntl(2) операцией F_SETFL), но отличие в том,что MSG_DONTWAIT указывается в вызове, а O_NONBLOCK задаётся вописании открытого файла (смотрите open(2)), что влияет на все нитивызывающего процесса, а также на другие процессы, у которых есть файловыедескрипторы, ссылающиеся на это описание открытого файла.MSG_EOR (начиная с Linux 2.2)Завершить запись (record) (если поддерживается, например в сокетах типаSOCK_SEQPACKET).MSG_MORE (начиная с Linux 2.4.4)Вызывающий имеет дополнительные данные для отправки. Этот флаг используетсяс сокетами TCP для получения такого же эффекта как с параметром сокетаTCP_CORK (см. tcp(7)), с той разницей, что этот флаг можноустанавливать при каждом вызове.

Начиная с Linux 2.6 этот флаг также поддерживается для сокетов UDP иинформирует ядро, о том что нужно упаковать все отправляемые данные вызововс этим флагом в одну дейтаграмму, которая передаётся только когдавыполняется вызов без указания этого флага (смотрите также описаниепараметра сокета UDP_CORK в udp(7)).

MSG_NOSIGNAL (начиная с Linux 2.2)Не генерировать сигнал SIGPIPE, если сторона потокоориентированногосокета закрыла соединение. Ошибка EPIPE по прежнему возвращается. Этосоздаёт поведение как при использовании sigaction(2) для игнорированияSIGPIPE, но MSG_NOSIGNAL является свойством вызова, а установкаSIGPIPE в атрибутах процесса влияет на все нити процесса.MSG_OOBПослать внепоточные данные, если сокет это поддерживает (как, например,сокеты типа SOCK_STREAM); протокол более низкого уровня также долженподдерживать внепоточные данные. Определение структуры msghdr, используемой sendmsg():struct msghdr { void *msg_name; /* необязательный адрес */ socklen_t msg_namelen; /* размер адреса */ struct iovec *msg_iov; /* массив приёма/передачи */ size_t msg_iovlen; /* # количество элементов в msg_iov */ void *msg_control; /* вспомогательные данные, смотрите ниже */ size_t msg_controllen; /* размер буфера вспомогательных данных */ int msg_flags; /* флаги (не используется) */};

Поле msg_name используется на неподключённом сокете для указания адресаназначения дейтаграммы. Оно указывает на буфер с адресом; в полеmsg_namelen должен быть указан размер адреса. Для подключённого сокетазначения этих полей должны быть равны NULL и 0, соответственно.

В полях msg_iov и msg_iovlen задаются места приёма/передачи, как дляwritev(2).

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

Поле msg_flags игнорируется.

При успешном выполнении эти вызовы возвращают количество отправленныхбайт. В случае ошибки возвращается -1, а errno устанавливается всоответствующее значение. Здесь представлено несколько стандартных ошибок, возвращаемых с уровнясокетов. Могут также появиться другие ошибки, возвращаемые изсоответствующих модулей протоколов; их описание находится в соответствующихсправочных страницах.EACCES(для доменных сокетов UNIX, которые идентифицируются по имени пути) Нет правна запись в файл сокета назначения или в одном из каталогов пути запрещёнпоиск (см. также path_resolution(7)).

(для сокетов UDP) Попытка отправки по сетевому/широковещательному адресу,как будто это был однозначный (unicast) адрес.

EAGAIN или EWOULDBLOCKСокет помечен как неблокирующий, но запрошенная операция привела бы кблокировке. POSIX.1-2001 допускает в этих случаях возврат ошибки и нетребует, чтобы эти константы имели одинаковое значение, поэтому переносимоеприложение должно проверять обе возможности.EAGAIN(доменные датаграммные сокеты Интернета) Сокет, указанный sockfd, ранеене был привязан к адресу и при попытке привязать его к эфемеридному порту,было определено, что все номера в диапазоне эфемеридных портов ужеиспользуются. Смотрите обсуждение /proc/sys/net/ipv4/ip_local_port_rangeв ip(7).EBADFЗначение sockfd не является правильным открытым файловым дескриптором.ECONNRESETСоединение сброшено другой стороной.EDESTADDRREQСокет в режиме без установления соединения и адрес второй стороны не задан.EFAULTВ аргументе указано неверное значение адреса пользовательского пространства.EINTRПолучен сигнал до начала передачи данных; смотрите signal(7).EINVALПередан неверный аргумент.EISCONNСокет в режиме с установлением соединения уже выполнил подключение, ноуказан получатель (теперь или возвращается эта ошибка, или игнорируетсяуказание получателя).EMSGSIZEДля типа сокета требуется, чтобы сообщение было отослано за время однойоперации (атомарно), а размер сообщения не позволяет этого.ENOBUFSИсходящая очередь сетевого интерфейса заполнена. Обычно это означает, чтоинтерфейс прекратил отправку, но это может быть также вызвано временнойперегрузкой сети. Обычно, в Linux этого не происходит. Пакеты простоотбрасываются, когда очередь устройства переполняется.ENOMEMБольше нет доступной памяти.ENOTCONNСокет не подключён и назначение не задано.ENOTSOCKФайловый дескриптор sockfd указывает не на каталог.EOPNOTSUPPОдин из битов в аргументе flags не может устанавливаться для этого типасокета.EPIPEЛокальный сокет, ориентированный на соединение, был закрыт. В этом случаепроцесс также получит сигнал SIGPIPE, если не установлен флагMSG_NOSIGNAL. 4.4BSD, SVr4, POSIX.1-2001. Эти интерфейсы впервые появились в 4.2BSD.

В POSIX.1-2001 описаны только флаги MSG_OOB и MSG_EOR. В POSIX.1-2008добавлено описание MSG_NOSIGNAL. Флаг MSG_CONFIRM являетсянестандартным расширением Linux.

В соответствие с POSIX.1-2001 поле msg_controllen структуры msghdrдолжно иметь тип socklen_t, но в настоящее время в glibc оно имеет типsize_t. В sendmmsg(2) можно найти информацию о специальном системном вызовеLinux, который можно использовать для передачи нескольких дейтаграмм за одинвызов.
Linux может вернуть EPIPE вместо ENOTCONN. Пример использования sendto() показан в getaddrinfo(3).

Источник: http://ru.manpages.org/sendto/2

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.