Freigeben über


sendto-Funktion (winsock2.h)

Die sendto-Funktion sendet Daten an ein bestimmtes Ziel.

Syntax

int WSAAPI 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
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAEACCES
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.
WSAEINVAL
Für einen Socket mit aktivierter SO_OOBINLINE wurde ein unbekanntes Flag angegeben oder MSG_OOB angegeben.
WSAEINTR
Ein blockierender Windows Sockets 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEFAULT
Die Parameter buf oder to sind nicht Teil des Benutzeradressraums, oder der Tolen-Parameter ist zu klein.
WSAENETRESET
Die Verbindung wurde unterbrochen, weil eine Keep-Alive-Aktivität einen Fehler erkannt hat, während der Vorgang ausgeführt wurde.
WSAENOBUFS
Es ist kein Pufferplatz verfügbar.
WSAENOTCONN
Der Socket ist nicht verbunden (nur verbindungsorientierte Sockets).
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEOPNOTSUPP
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.
WSAESHUTDOWN
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.
WSAEWOULDBLOCK
Der Socket wird als nicht blockiert markiert, und der angeforderte Vorgang würde blockiert.
WSAEMSGSIZE
Der Socket ist nachrichtenorientiert, und die Nachricht ist größer als das maximum, das vom zugrunde liegenden Transport unterstützt wird.
WSAEHOSTUNREACH
Der Remotehost kann derzeit nicht von diesem Host aus erreicht werden.
WSAECONNABORTED
Timeout- oder anderer Fehler. Die virtuelle Verbindung wurde beendet. Die Anwendung sollte den Socket schließen, weil er nicht mehr verwendbar ist.
WSAECONNRESET
Die virtuelle Verbindung wurde von der Remoteseite zurückgesetzt, die einen harten oder abbrechenden Schließvorgang ausgeführt hat. Für UPD-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.
WSAEADDRNOTAVAIL
Die Remoteadresse ist keine gültige Adresse, z. B. ADDR_ANY.
WSAEAFNOSUPPORT
Adressen in der angegebenen Adressfamilie können nicht mit diesem Socket verwendet werden.
WSAEDESTADDRREQ
Eine Zieladresse ist erforderlich.
WSAENETUNREACH
Das Netzwerk kann von diesem Host zurzeit nicht erreicht werden.
WSAEHOSTUNREACH
Versuch eines Socketvorgangs für einen nicht erreichbaren Host.
WSAETIMEDOUT
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).

Hinweis Wenn ein Socket geöffnet wird, wird ein setsockopt-Aufruf ausgeführt, und dann wird ein sendto-Aufruf ausgeführt, Windows Sockets führt einen impliziten Bindungsfunktionsaufruf aus.
 
Wenn der Socket ungebunden ist, werden der lokalen Zuordnung vom System eindeutige Werte zugewiesen, und der Socket wird dann als gebunden markiert. Wenn der Socket verbunden ist, kann die getsockname-Funktion verwendet werden, um die lokale IP-Adresse und den Port zu bestimmen, die dem Socket zugeordnet sind.

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.

Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie sendto ausstellen, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Anruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit aus, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der für denselben Thread geplant ist. Das Ausstellen eines weiteren blockierenden Winsock-Aufrufs innerhalb eines APC, der einen fortlaufend blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu undefiniertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

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 winsock2.h (einschließlich Winsock2.h)
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

WSAAsyncWählen

WSAEventSelect

Winsock-Funktionen

Winsock-Referenz

Recv

recvfrom

select

send

Socket