sendto-Funktion (winsock.h)
Die sendto-Funktion sendet Daten an ein bestimmtes Ziel.
Syntax
int sendto(
[in] SOCKET s,
[in] const char *buf,
[in] int len,
[in] int flags,
[in] const sockaddr *to,
[in] int tolen
);
Parameter
[in] s
Ein Deskriptor, der einen (möglicherweise verbundenen) Socket identifiziert.
[in] buf
Ein Zeiger auf einen Puffer, der die zu übertragenden Daten enthält.
[in] len
Die Länge der Daten in Bytes, auf die der buf-Parameter verweist.
[in] flags
Ein Satz von Flags, die die Art und Weise angeben, in der der Aufruf erfolgt.
[in] to
Ein optionaler Zeiger auf eine sockaddr-Struktur , die die Adresse des Zielsockets enthält.
[in] tolen
Die Größe der Adresse in Bytes, auf die der To-Parameter verweist.
Rückgabewert
Wenn kein Fehler auftritt, gibt sendto die Gesamtzahl der gesendeten Bytes zurück, die kleiner als die durch len angegebene Zahl sein kann. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Fehler beim Netzwerksubsystem. | |
Die angeforderte Adresse ist eine Broadcastadresse, aber das entsprechende Flag wurde nicht festgelegt. Rufen Sie setsockopt mit dem parameter SO_BROADCAST auf, um die Verwendung der Broadcastadresse zu ermöglichen. | |
Für einen Socket mit aktivierter SO_OOBINLINE wurde ein unbekanntes Flag angegeben oder MSG_OOB angegeben. | |
Ein blockierender Windows Sockets 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
Die Parameter buf oder to sind nicht Teil des Benutzeradressraums, oder der Tolen-Parameter ist zu klein. | |
Die Verbindung wurde unterbrochen, weil eine Keep-Alive-Aktivität einen Fehler erkannt hat, während der Vorgang ausgeführt wurde. | |
Es ist kein Pufferplatz verfügbar. | |
Der Socket ist nicht verbunden (nur verbindungsorientierte Sockets). | |
Der Deskriptor ist kein Socket. | |
MSG_OOB angegeben wurde, aber der Socket nicht im Streamstil wie typ SOCK_STREAM, werden OOB-Daten in der diesem Socket zugeordneten Kommunikationsdomäne nicht unterstützt, oder der Socket ist unidirektional und unterstützt nur Empfangsvorgänge. | |
Die Steckdose wurde heruntergefahren; Es ist nicht möglich, an einen Socket zu senden, nachdem das Herunterfahren aufgerufen wurde, wobei auf SD_SEND oder SD_BOTH festgelegt wurde. | |
Der Socket wird als nicht blockiert markiert, und der angeforderte Vorgang würde blockiert. | |
Der Socket ist nachrichtenorientiert, und die Nachricht ist größer als das maximum, das vom zugrunde liegenden Transport unterstützt wird. | |
Der Remotehost kann derzeit nicht von diesem Host aus erreicht werden. | |
Timeout- oder anderer Fehler. Die virtuelle Verbindung wurde beendet. Die Anwendung sollte den Socket schließen, weil er nicht mehr verwendbar ist. | |
Die virtuelle Verbindung wurde von der Remoteseite zurückgesetzt, die einen harten oder abbrechenden Schließvorgang ausgeführt hat. Bei UDP-Sockets konnte der Remotehost kein zuvor gesendetes UDP-Datagramm übermitteln und antwortete mit einem ICMP-Paket "Port unreachable". Die Anwendung sollte den Socket schließen, weil er nicht mehr verwendbar ist. | |
Die Remoteadresse ist keine gültige Adresse, z. B. ADDR_ANY. | |
Adressen in der angegebenen Adressfamilie können nicht mit diesem Socket verwendet werden. | |
Eine Zieladresse ist erforderlich. | |
Das Netzwerk kann von diesem Host zurzeit nicht erreicht werden. | |
Versuch eines Socketvorgangs für einen nicht erreichbaren Host. | |
Die Verbindung wurde aufgrund eines Netzwerkfehlers oder des Ausfalls des Systems am anderen Ende ohne Vorheriges unterbrochen. |
Hinweise
Die sendto-Funktion wird verwendet, um ausgehende Daten in einen Socket zu schreiben. Bei nachrichtenorientierten Sockets muss darauf geachtet werden, dass die maximale Paketgröße der zugrunde liegenden Subnetze nicht überschritten wird, die mithilfe von getsockopt abgerufen werden kann, um den Wert der Socketoption SO_MAX_MSG_SIZE abzurufen. Wenn die Daten zu lang sind, um sie atomar durch das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE zurückgegeben, und es werden keine Daten übertragen.
Der To-Parameter kann eine beliebige gültige Adresse in der Adressfamilie des Sockets sein, einschließlich einer Broadcast- oder Multicastadresse. Zum Senden an eine Broadcastadresse muss eine Anwendung setockopt mit aktiviertem SO_BROADCAST verwendet haben. Andernfalls schlägt sendto mit dem Fehlercode WSAEACCES fehl. Bei TCP/IP kann eine Anwendung an eine beliebige Multicastadresse senden (ohne Mitglied einer Gruppe zu werden).
Wenn der Socket nicht verbunden ist,
Die getsockname-Funktion kann verwendet werden, um die dem Socket zugeordnete lokale Portnummer zu bestimmen, aber die zurückgegebene IP-Adresse wird auf die Platzhalteradresse für das angegebene Protokoll festgelegt (z. B. INADDR_ANY oder "0.0.0.0" für IPv4 und IN6ADDR_ANY_INIT oder "::" für IPv6).
Der erfolgreiche Abschluss eines Sendto-Vorgangs gibt nicht an, dass die Daten erfolgreich übermittelt wurden.
Die sendto-Funktion wird normalerweise für einen verbindungslosen Socket verwendet, um ein Datagramm an einen bestimmten Peersocket zu senden, der durch den to-Parameter identifiziert wird. Auch wenn der verbindungslose Socket zuvor mit einer bestimmten Adresse verbunden wurde, überschreibt der to-Parameter nur die Zieladresse für dieses bestimmte Datagramm. In einem verbindungsorientierten Socket werden die Parameter to und tolen ignoriert, sodass sendtomit send gleichwertig ist.
Beispielcode
Im folgenden Beispiel wird die Verwendung der sendto-Funktion veranschaulicht.#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// 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\n", 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\n", 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 *) & RecvAddr, sizeof (RecvAddr));
if (iResult == SOCKET_ERROR) {
wprintf(L"sendto failed with error: %d\n", 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: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
//---------------------------------------------
// Clean up and quit.
wprintf(L"Exiting.\n");
WSACleanup();
return 0;
}
Für Sockets mit IP-Adresse (Version 4)
Zum Senden einer Übertragung (nur auf einem SOCK_DGRAM) kann die Adresse, auf die der To-Parameter verweist, so konstruiert werden, dass sie die spezielle IPv4-Adresse INADDR_BROADCAST (definiert in Winsock2.h) zusammen mit der beabsichtigten Portnummer enthält. Wenn die Adresse, auf die vom To-Parameter verwiesen wird, die INADDR_BROADCAST Adresse und den vorgesehenen Port enthält, wird die Übertragung an alle Schnittstellen zu diesem Port gesendet.Wenn die Übertragung nur über eine bestimmte Schnittstelle gesendet werden soll, sollte die Adresse, auf die der To-Parameter verweist, die Subnetz-Broadcastadresse für die Schnittstelle und den beabsichtigten Port enthalten. Beispielsweise würde eine IPv4-Netzwerkadresse von 192.168.1.0 mit einer Subnetzmaske von 255.255.255.0 die Subnetz-Broadcastadresse 192.168.1.255 verwenden.
Es ist im Allgemeinen nicht zu vermeiden, dass ein Broadcast-Datagramm die Größe überschreitet, bei der die Fragmentierung auftreten kann. Dies bedeutet, dass der Datenteil des Datagramms (mit Ausnahme von Headern) 512 Byte nicht überschreiten sollte.
Wenn im Transportsystem kein Pufferspeicher zur Verfügung steht, um die zu übertragenden Daten aufzunehmen, wird sendto blockiert, es sei denn, der Socket wurde in einen Nichtblockierungsmodus versetzt. Bei nicht blockierenden, streamorientierten Sockets kann die Anzahl der geschriebenen Bytes zwischen 1 und der angeforderten Länge betragen, abhängig von der Pufferverfügbarkeit sowohl auf dem Client- als auch auf dem Serversystem. Die Funktion select, WSAAsyncSelect oder WSAEventSelect kann verwendet werden, um zu bestimmen, wann mehr Daten gesendet werden können.
Das Aufrufen von sendto mit einem Wert von null ist zulässig und gibt null als gültigen Wert zurück. Für nachrichtenorientierte Sockets wird ein Transportdatengramm der Länge Null gesendet.
Der Flags-Parameter kann verwendet werden, um das Verhalten des Funktionsaufrufs über die für den zugeordneten Socket angegebenen Optionen hinaus zu beeinflussen. Die Semantik dieser Funktion wird durch die Socketoptionen und den Flags-Parameter bestimmt. Letzteres wird mithilfe des bitweisen OR-Operators mit einem der folgenden Werte erstellt.
Wert | Bedeutung |
---|---|
MSG_DONTROUTE | Gibt an, dass die Daten nicht routingpflichtig sein sollen. Ein Windows Sockets-Dienstanbieter kann dieses Flag ignorieren. |
MSG_OOB | Sendet OOB-Daten (nur Socket im Streamformat, z. B. SOCK_STREAM). |
Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winsock.h (einschließlich Winsock2.h) |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |