recvfrom-Funktion (winsock2.h)
Die recvfrom-Funktion empfängt ein Datagramm und speichert die Quelladresse.
Syntax
int WSAAPI 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 anmerkungen unten.
[out] from
Ein optionaler Zeiger auf einen Puffer in einer Sockaddr-Struktur , der bei der Rückgabe die Quelladresse 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 0. 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. | |
Beim Netzwerksubsystem ist ein Fehler aufgetreten. | |
Der Puffer, auf den vom Parameter "buf " oder "from " verwiesen wird, befindet sich nicht im Benutzeradressraum, oder der fromlen-Parameter ist zu klein, um die Quelladresse der Peeradresse aufzunehmen. | |
Der (blockierende) Aufruf wurde über WSACancelBlockingCall abgebrochen. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Der Socket wurde nicht an eine Bindung gebunden, oder ein unbekanntes Flag wurde angegeben, oder MSG_OOB für einen Socket mit aktiviertem SO_OOBINLINE angegeben wurde, oder (nur für Bytestream-Sockets) war len null oder negativ. | |
Der Socket ist verbunden. Diese Funktion ist bei einem verbundenen Socket nicht zulässig, unabhängig davon, ob der Socket verbindungsorientiert oder verbindungslos ist. | |
Für einen Datagrammsocket zeigt dieser Fehler an, dass die Gültigkeitsdauer abgelaufen ist. | |
Der Deskriptor im s-Parameter ist kein Socket. | |
MSG_OOB angegeben wurde, aber der Socket nicht im Streamformat wie der 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. | |
Der Socket wurde heruntergefahren. Es ist nicht möglich, von einem Socket wiederzurücken , nachdem das Herunterfahren mit der Einstellung auf SD_RECEIVE oder SD_BOTH aufgerufen wurde. | |
Der Socket ist als nicht blockierend gekennzeichnet, und der Recvfrom-Vorgang würde blockiert. | |
Die Nachricht war zu groß, um in den Puffer zu passen, auf den der buf-Parameter verweist, und wurde abgeschnitten. | |
Die Verbindung wurde aufgrund eines Netzwerkfehlers oder des Ausfalls des Systems am anderen Ende ohne Vorheriges abgebrochen. | |
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 ist nicht mehr verwendbar. Auf einem UDP-Datagram-Socket weist dieser Fehler darauf hin, 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 durch Bindung. Von expliziter Bindung wird für Clientanwendungen 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 noch weitere OOB-Daten gelesen werden müssen. Die Parameter from und fromlen werden für verbindungsorientierte Sockets ignoriert.
Bei nachrichtenorientierten Sockets werden Daten aus der ersten in die Warteschlange gestellten Nachricht bis zur Größe des angegebenen Puffers extrahiert. 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) geht die überschüssigen Daten verloren. Wenn das empfangene Paket keine Daten (leer) enthält, ist der Rückgabewert der recvfrom-Funktion 0.
Wenn der from-Parameter nonzero ist und der Socket nicht verbindungsorientiert ist (geben Sie z. B. SOCK_DGRAM ein), 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 und wartet die Recvfrom-Funktion , 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. Mit select, WSAAsyncSelect oder WSAEventSelect können Sie bestimmen, wann weitere Daten eintreffen.
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). |
Beispielcode
Im folgenden Beispiel wird die Verwendung der funktion recvfrom 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;
sockaddr_in RecvAddr;
unsigned short Port = 27015;
char RecvBuf[1024];
int BufLen = 1024;
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 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 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 | winsock2.h (Winsock2.h einschließen) |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |