recvfrom-Funktion (winsock.h)

Die recvfrom-Funktion empfängt ein Datagramm und speichert die Quelladresse.

Syntax

int recvfrom(
  [in]                SOCKET   s,
  [out]               char     *buf,
  [in]                int      len,
  [in]                int      flags,
  [out]               sockaddr *from,
  [in, out, optional] int      *fromlen
);

Parameter

[in] s

Ein Deskriptor, der einen gebundenen Socket identifiziert.

[out] buf

Ein Puffer für die eingehenden Daten.

[in] len

Die Länge des Puffers in Bytes, auf den der buf-Parameter verweist.

[in] flags

Eine Reihe von Optionen, die das Verhalten des Funktionsaufrufs über die für den zugeordneten Socket angegebenen Optionen hinaus ändern. Weitere Informationen finden Sie in den nachstehenden Hinweisen.

[out] from

Ein optionaler Zeiger auf einen Puffer in einer sockaddr-Struktur , der die Quelladresse bei der Rückgabe enthält.

[in, out, optional] fromlen

Ein optionaler Zeiger auf die Größe des Puffers in Bytes, auf den der from-Parameter verweist.

Rückgabewert

Wenn kein Fehler auftritt, gibt recvfrom die Anzahl der empfangenen Bytes zurück. Wenn die Verbindung ordnungsgemäß geschlossen wurde, ist der Rückgabewert null. 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.
WSAEFAULT
Der Puffer, auf den vom buf - oder from-Parameter verwiesen wird, befindet sich nicht im Benutzeradressraum, oder der fromlen-Parameter ist zu klein, um die Quelladresse der Peeradresse aufzunehmen.
WSAEINTR
Der (blockierende) Anruf wurde über WSACancelBlockingCall abgebrochen.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEINVAL
Der Socket wurde nicht mit bind gebunden, oder ein unbekanntes Flag wurde angegeben, oder MSG_OOB für einen Socket mit aktiviertem SO_OOBINLINE angegeben wurde, oder (nur für Sockets im Bytestreamformat) war len null oder negativ.
WSAEISCONN
Der Socket ist verbunden. Diese Funktion ist bei einem verbundenen Socket nicht zulässig, unabhängig davon, ob der Socket verbindungsorientiert oder verbindungslos ist.
WSAENETRESET
Für einen Datagrammsocket zeigt dieser Fehler an, dass die Gültigkeitsdauer abgelaufen ist.
WSAENOTSOCK
Der Deskriptor im s-Parameter 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 Sendevorgänge.
WSAESHUTDOWN
Die Steckdose wurde heruntergefahren; Nach dem Aufrufen des Herunterfahrens mit SD_RECEIVE oder SD_BOTH ist es nicht möglich, von einem Socket wiederzurücken.
WSAEWOULDBLOCK
Der Socket wird als nicht blockiert markiert, und der Recvfrom-Vorgang würde blockiert.
WSAEMSGSIZE
Die Nachricht war zu groß, um in den Puffer zu passen, auf den der buf-Parameter verweist, und wurde abgeschnitten.
WSAETIMEDOUT
Die Verbindung wurde aufgrund eines Netzwerkfehlers oder des Ausfalls des Systems am anderen Ende ohne Vorheriges unterbrochen.
WSAECONNRESET
Die virtuelle Verbindung wurde von der Remoteseite zurückgesetzt, die einen harten oder abbrechenden Schließvorgang ausgeführt hat. Die Anwendung sollte den Socket schließen. sie kann nicht mehr verwendet werden. Bei einem UDP-Datagrammsocket gibt dieser Fehler an, dass ein vorheriger Sendevorgang zu einer ICMP-Port unreachable-Nachricht geführt hat.

Hinweise

Die recvfrom-Funktion liest eingehende Daten auf verbundenen und nicht verbundenen Sockets und erfasst die Adresse, von der die Daten gesendet wurden. Diese Funktion wird in der Regel mit verbindungslosen Sockets verwendet. Die lokale Adresse des Sockets muss bekannt sein. Bei Serveranwendungen erfolgt dies in der Regel explizit über die Bindung. Von einer expliziten Bindung für Clientanwendungen wird abgeraten. Bei Clientanwendungen, die diese Funktion verwenden, kann der Socket implizit über sendto, WSASendTo oder WSAJoinLeaf an eine lokale Adresse gebunden werden.

Für datenstromorientierte Sockets, z. B. solche vom Typ SOCK_STREAM, gibt ein Aufruf von recvfrom so viele Informationen zurück, wie derzeit verfügbar sind – bis zur Größe des angegebenen Puffers. Wenn der Socket für den Inlineempfang von OOB-Daten konfiguriert wurde (Socketoption SO_OOBINLINE) und OOB-Daten noch ungelesen sind, werden nur OOB-Daten zurückgegeben. Die Anwendung kann den Befehl ioctlsocket oder WSAIoctlSIOCATMARK verwenden, um zu bestimmen, ob weitere OOB-Daten noch gelesen werden müssen. Die Parameter from und fromlen werden für verbindungsorientierte Sockets ignoriert.

Für nachrichtenorientierte Sockets werden Daten aus der ersten in die Warteschlange gestellten Nachricht extrahiert, bis zur Größe des angegebenen Puffers. Wenn das Datagramm oder die Nachricht größer als der angegebene Puffer ist, wird der Puffer mit dem ersten Teil des Datagramms gefüllt, und recvfrom generiert den Fehler WSAEMSGSIZE. Bei unzuverlässigen Protokollen (z. B. UDP) sind die überschüssigen Daten verloren. Wenn das empfangene Paket keine Daten (leer) enthält, ist der Rückgabewert der funktion recvfrom null.

Wenn der from-Parameter ungleich null ist und der Socket nicht verbindungsorientiert ist (z. B. typ SOCK_DGRAM), wird die Netzwerkadresse des Peers, der die Daten gesendet hat, in die entsprechende sockaddr-Struktur kopiert. Der Wert, auf den fromlen verweist, wird auf die Größe dieser Struktur initialisiert und bei der Rückgabe geändert, um die tatsächliche Größe der in der sockaddr-Struktur gespeicherten Adresse anzugeben.

Wenn keine eingehenden Daten am Socket verfügbar sind, blockiert die recvfrom-Funktion und wartet, bis Daten gemäß den für WSARecv definierten Blockierungsregeln mit dem MSG_PARTIAL-Flag nicht festgelegt werden, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird der Wert SOCKET_ERROR zurückgegeben, wobei der Fehlercode auf WSAEWOULDBLOCK festgelegt ist. Select,WSAAsyncSelect oder WSAEventSelect können verwendet werden, um zu bestimmen, wann weitere Daten eingehen.

Wenn der Socket verbindungsorientiert ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird der Aufruf von recvfrom sofort mit null empfangenen Bytes abgeschlossen. Wenn die Verbindung zurückgesetzt wurde , schlägt recvfrom mit dem Fehler WSAECONNRESET fehl.

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_PEEK Hier werden die eingehenden Daten angezeigt. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.
MSG_OOB Verarbeitet Out-of-Band-Daten (OOB).
 
Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie recvfrom 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 recvfrom-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 = 0;

    WSADATA wsaData;

    SOCKET RecvSocket;
    struct sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    char RecvBuf[1024];
    int BufLen = 1024;

    struct sockaddr_in SenderAddr;
    int SenderAddrSize = sizeof (SenderAddr);

    //-----------------------------------------------
    // 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 receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
    wprintf(L"Receiving datagrams...\n");
    iResult = recvfrom(RecvSocket,
                       RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
    }
 
    //-----------------------------------------------
    // Close the socket when finished receiving datagrams
    wprintf(L"Finished receiving. Closing socket.\n");
    iResult = closesocket(RecvSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
        return 1;
    }

    //-----------------------------------------------
    // Clean up and exit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;
}


Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8 unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

Anforderung Wert
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

Weitere Informationen

WSAAsyncWählen

WSAEventSelect

Winsock-Funktionen

Winsock-Referenz

Recv

send

sockaddr

Socket