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 |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Fehler beim Netzwerksubsystem. | |
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. | |
Der (blockierende) Anruf wurde über WSACancelBlockingCall abgebrochen. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
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. | |
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 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. | |
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. | |
Der Socket wird als nicht blockiert markiert, 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 unterbrochen. | |
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). |
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 |