Função recvfrom (winsock.h)

A função recvfrom recebe um datagrama e armazena o endereço de origem.

Sintaxe

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

Parâmetros

[in] s

Um descritor que identifica um soquete associado.

[out] buf

Um buffer para os dados de entrada.

[in] len

O comprimento, em bytes, do buffer apontado pelo parâmetro buf .

[in] flags

Um conjunto de opções que modificam o comportamento da chamada de função além das opções especificadas para o soquete associado. Consulte os Comentários abaixo para obter mais detalhes.

[out] from

Um ponteiro opcional para um buffer em uma estrutura sockaddr que manterá o endereço de origem no retorno.

[in, out, optional] fromlen

Um ponteiro opcional para o tamanho, em bytes, do buffer apontado pelo parâmetro from .

Retornar valor

Se nenhum erro ocorrer, recvfrom retornará o número de bytes recebidos. Se a conexão tiver sido normalmente fechada, o valor retornado será zero. Caso contrário, um valor de SOCKET_ERROR será retornado e um código de erro específico poderá ser recuperado chamando WSAGetLastError.

Código do erro Significado
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAENETDOWN
O subsistema de rede falhou.
WSAEFAULT
O buffer apontado pelos parâmetros buf ou from não está no espaço de endereço do usuário ou o parâmetro fromlen é muito pequeno para acomodar o endereço de origem do endereço par.
WSAEINTR
A chamada (bloqueio) foi cancelada por meio de WSACancelBlockingCall.
WSAEINPROGRESS
Uma chamada de bloqueio do Windows Sockets 1.1 está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEINVAL
O soquete não foi associado à associação ou um sinalizador desconhecido foi especificado ou MSG_OOB foi especificado para um soquete com SO_OOBINLINE habilitado ou (somente para soquetes no estilo fluxo de bytes) len era zero ou negativo.
WSAEISCONN
O soquete está conectado. Essa função não é permitida com um soquete conectado, independentemente de o soquete ser orientado para conexão ou sem conexão.
WSAENETRESET
Para um soquete de datagrama, este erro indica que a vida útil venceu.
WSAENOTSOCK
O descritor no parâmetro s não é um soquete.
WSAEOPNOTSUPP
MSG_OOB foi especificado, mas o soquete não é estilo de fluxo, como tipo SOCK_STREAM, não há suporte para dados OOB no domínio de comunicação associado a esse soquete ou o soquete é unidirecional e dá suporte apenas a operações de envio.
WSAESHUTDOWN
O soquete foi desligado; não é possível revfrom em um soquete após o desligamento ter sido invocado com a definição de como SD_RECEIVE ou SD_BOTH.
WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operação recvfrom seria bloqueada.
WSAEMSGSIZE
A mensagem era muito grande para caber no buffer apontado pelo parâmetro buf e foi truncada.
WSAETIMEDOUT
A conexão foi descartada devido a uma falha de rede ou porque o sistema na outra extremidade ficou inativo sem aviso prévio.
WSAECONNRESET
O circuito virtual foi redefinido pelo lado remoto executando um fechamento forçado ou por anulação. O aplicativo deve fechar o soquete; não é mais utilizável. Em um soquete UDP-datagram, esse erro indica que uma operação de envio anterior resultou em uma mensagem de Porta ICMP Inacessível .

Comentários

A função recvfrom lê dados de entrada em soquetes conectados e não conectados e captura o endereço do qual os dados foram enviados. Essa função normalmente é usada com soquetes sem conexão. O endereço local do soquete deve ser conhecido. Para aplicativos de servidor, isso geralmente é feito explicitamente por meio da associação. A associação explícita é desencorajada para aplicativos cliente. Para aplicativos cliente que usam essa função, o soquete pode se tornar implicitamente associado a um endereço local por meio de sendto, WSASendTo ou WSAJoinLeaf.

Para soquetes orientados a fluxo, como os do tipo SOCK_STREAM, uma chamada para revfrom retorna o máximo de informações que está disponível atualmente, até o tamanho do buffer especificado. Se o soquete tiver sido configurado para recepção embutida de dados OOB (opção de soquete SO_OOBINLINE) e os dados OOB ainda não forem lidos, somente os dados OOB serão retornados. O aplicativo pode usar o comando ioctlsocket ou WSAIoctlSIOCATMARK para determinar se ainda há mais dados OOB a serem lidos. Os parâmetros from e fromlen são ignorados para soquetes orientados à conexão.

Para soquetes orientados a mensagens, os dados são extraídos da primeira mensagem enfileirada, até o tamanho do buffer especificado. Se o datagrama ou a mensagem for maior que o buffer especificado, o buffer será preenchido com a primeira parte do datagrama e o recvfrom gerará o erro WSAEMSGSIZE. Para protocolos não confiáveis (por exemplo, UDP), os dados em excesso são perdidos. Para UDP se o pacote recebido não contiver dados (vazios), o valor retornado da função recvfrom será zero.

Se o parâmetro from for diferente de zero e o soquete não for orientado para conexão, (tipo SOCK_DGRAM por exemplo), o endereço de rede do par que enviou os dados será copiado para a estrutura sockaddr correspondente. O valor apontado por fromlen é inicializado para o tamanho dessa estrutura e é modificado, no retorno, para indicar o tamanho real do endereço armazenado na estrutura sockaddr .

Se nenhum dado de entrada estiver disponível no soquete, a função recvfrom bloqueará e aguardará a chegada dos dados de acordo com as regras de bloqueio definidas para WSARecv com o sinalizador MSG_PARTIAL não definido, a menos que o soquete não esteja sendo desbloqueado. Nesse caso, um valor de SOCKET_ERROR é retornado com o código de erro definido como WSAEWOULDBLOCK. A seleção, WSAAsyncSelect ou WSAEventSelect pode ser usada para determinar quando mais dados chegam.

Se o soquete for orientado à conexão e o lado remoto tiver desligado a conexão normalmente, a chamada para recvfrom será concluída imediatamente com zero bytes recebidos. Se a conexão tiver sido redefinida recvfrom falhará com o erro WSAECONNRESET.

O parâmetro flags pode ser usado para influenciar o comportamento da invocação de função além das opções especificadas para o soquete associado. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro flags . Este último é construído usando o operador OR bit a bit com qualquer um dos valores a seguir.

Valor Significado
MSG_PEEK Espia os dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.
MSG_OOB Processa dados fora de banda (OOB).
 
Nota Ao emitir uma chamada winsock de bloqueio, como recvfrom, Winsock pode precisar aguardar um evento de rede antes que a chamada possa ser concluída. O Winsock executa uma espera alertável nessa situação, que pode ser interrompida por uma APC (chamada de procedimento assíncrono) agendada no mesmo thread. A emissão de outra chamada winsock de bloqueio dentro de um APC que interrompeu uma chamada Winsock de bloqueio contínuo no mesmo thread levará a um comportamento indefinido e nunca deve ser tentada por clientes Winsock.
 

Código de exemplo

O exemplo a seguir demonstra o uso da função recvfrom .
#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: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.

Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho winsock.h (inclua Winsock2.h)
Biblioteca Ws2_32.lib
DLL Ws2_32.dll

Confira também

WSAAsyncSelect

Wsaeventselect

Funções Winsock

Referência de Winsock

Recv

send

Sockaddr

socket