Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Representa um Windows Socket — um ponto de extremidade de comunicação de rede.
Sintaxe
class CAsyncSocket : public CObject
Membros
Construtores Públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::CAsyncSocket |
Constrói um objeto CAsyncSocket. |
Métodos Públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::Accept |
Aceita uma conexão no soquete. |
CAsyncSocket::AsyncSelect |
Solicita notificação de evento para o soquete. |
CAsyncSocket::Attach |
Anexa uma alça de soquete a um CAsyncSocket objeto. |
CAsyncSocket::Bind |
Associa um endereço local ao soquete. |
CAsyncSocket::Close |
Fecha o soquete. |
CAsyncSocket::Connect |
Estabelece uma conexão com um soquete de mesmo nível. |
CAsyncSocket::Create |
Cria um soquete. |
CAsyncSocket::CreateEx |
Cria um soquete com opções avançadas. |
CAsyncSocket::Detach |
Desanexa uma alça de soquete de um CAsyncSocket objeto. |
CAsyncSocket::FromHandle |
Retorna um ponteiro para um CAsyncSocket objeto, dado um identificador de soquete. |
CAsyncSocket::GetLastError |
Obtém o status de erro da última operação que falhou. |
CAsyncSocket::GetPeerName |
Obtém o endereço do soquete de mesmo nível ao qual o soquete está conectado. |
CAsyncSocket::GetPeerNameEx |
Obtém o endereço do soquete de mesmo nível ao qual o soquete está conectado (lida com endereços IPv6). |
CAsyncSocket::GetSockName |
Obtém o nome local de um soquete. |
CAsyncSocket::GetSockNameEx |
Obtém o nome local de um soquete (manipula endereços IPv6). |
CAsyncSocket::GetSockOpt |
Recupera uma opção de soquete. |
CAsyncSocket::IOCtl |
Controla o modo do soquete. |
CAsyncSocket::Listen |
Estabelece um soquete para escutar solicitações de conexão de entrada. |
CAsyncSocket::Receive |
Recebe dados do soquete. |
CAsyncSocket::ReceiveFrom |
Recebe um datagrama e armazena o endereço de origem. |
CAsyncSocket::ReceiveFromEx |
Recebe um datagrama e armazena o endereço de origem (lida com endereços IPv6). |
CAsyncSocket::Send |
Envia dados para um soquete conectado. |
CAsyncSocket::SendTo |
Envia dados para um destino específico. |
CAsyncSocket::SendToEx |
Envia dados para um destino específico (lida com endereços IPv6). |
CAsyncSocket::SetSockOpt |
Define uma opção de soquete. |
CAsyncSocket::ShutDown |
Desativa Send e/ou Receive chama o soquete. |
CASyncSocket::Socket |
Aloca uma alça de soquete. |
Métodos Protegidos
| Nome | Descrição |
|---|---|
CAsyncSocket::OnAccept |
Notifica um soquete de escuta de que ele pode aceitar solicitações de conexão pendentes chamando Accept. |
CAsyncSocket::OnClose |
Notifica um soquete de que o soquete conectado a ele fechou. |
CAsyncSocket::OnConnect |
Notifica um soquete de conexão de que a tentativa de conexão foi concluída, seja com êxito ou por engano. |
CAsyncSocket::OnOutOfBandData |
Notifica um soquete de recebimento de que há dados fora de banda para serem lidos no soquete, geralmente uma mensagem urgente. |
CAsyncSocket::OnReceive |
Notifica um soquete de escuta de que há dados a serem recuperados chamando Receive. |
CAsyncSocket::OnSend |
Notifica um soquete de que ele pode enviar dados chamando Send. |
Operadores Públicos
| Nome | Descrição |
|---|---|
| CAsyncSocket::operador = | Atribui um novo valor a um CAsyncSocket objeto. |
| CAsyncSocket::operador SOCKET | Use este operador para recuperar o SOCKETCAsyncSocket identificador do objeto. |
Membros de Dados Públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::m_hSocket |
Indica o identificador anexado SOCKET a este CAsyncSocket objeto. |
Observações
Class CAsyncSocket encapsula a API de funções de soquete do Windows, fornecendo uma abstração orientada a objetos para programadores que desejam usar o Windows Sockets em conjunto com o MFC.
Esta classe baseia-se no pressuposto de que compreende as comunicações de rede. Você é responsável por lidar com bloqueios, diferenças de ordem de bytes e conversões entre cadeias de caracteres Unicode e MBCS (conjunto de caracteres multibyte). Se você quiser uma interface mais conveniente que gerencie esses problemas para você, consulte classe CSocket.
Para usar um CAsyncSocket objeto, chame seu construtor e, em seguida, chame a Create função para criar o identificador de soquete subjacente (tipo SOCKET), exceto em soquetes aceitos. Para um soquete de servidor, chame a Listen função de membro e, para um soquete de cliente, chame a Connect função de membro. O soquete do servidor deve chamar a Accept função ao receber uma solicitação de conexão. Use as funções restantes CAsyncSocket para realizar comunicações entre tomadas. Após a conclusão, destrua o CAsyncSocket objeto se ele foi criado na pilha, o destruidor chama automaticamente a Close função. O SOCKET tipo de dados é descrito no artigo Windows Sockets: Background.
Observação
Ao usar soquetes MFC em threads secundários em um aplicativo MFC vinculado estaticamente, você deve chamar AfxSocketInit cada thread que usa soquetes para inicializar as bibliotecas de soquetes. Por padrão, AfxSocketInit é chamado apenas no thread primário.
Para obter mais informações, consulte Windows Sockets: Usando classe CAsyncSocket e artigos relacionados., bem como API do Windows Sockets 2.
Hierarquia de herança
CAsyncSocket
Requerimentos
Cabeçalho:afxsock.h
CAsyncSocket::Accept
Chame essa função de membro para aceitar uma conexão em um soquete.
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
Parâmetros
rConnectedSocket
Uma referência que identifica um novo soquete que está disponível para conexão.
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que recebe o endereço do soquete de conexão, conforme conhecido na rede. O formato exato do lpSockAddr argumento é determinado pela família de endereços estabelecida quando o soquete foi criado. Se lpSockAddr e/ou lpSockAddrLen forem iguais a NULL, nenhuma informação sobre o endereço remoto do soquete aceito será retornada.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr bytes. O lpSockAddrLen é um parâmetro valor-resultado: ele deve conter inicialmente a quantidade de espaço apontado por lpSockAddr; no retorno, ele conterá o comprimento real (em bytes) do endereço retornado.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento é muito pequeno (menor do que o tamanho de umaSOCKADDRestrutura).WSAEINPROGRESSUma chamada de bloqueio do Windows Sockets está em andamento.WSAEINVALListennão foi invocado antes da aceitação.WSAEMFILEA fila está vazia na entrada para aceitar e não há descritores disponíveis.WSAENOBUFSNão há espaço de buffer disponível.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPO soquete referenciado não é um tipo que oferece suporte a serviço orientado a conexão.WSAEWOULDBLOCKO soquete está marcado como sem bloqueio e nenhuma conexão está presente para ser aceito.
Observações
Essa rotina extrai a primeira conexão na fila de conexões pendentes, cria um novo soquete com as mesmas propriedades desse soquete e o anexa ao rConnectedSocket. Se nenhuma conexão pendente estiver presente na fila, Accept retornará zero e GetLastError retornará um erro. O soquete aceito (rConnectedSocket) não pode ser usado para aceitar mais conexões. A tomada original permanece aberta e ouvindo.
O argumento lpSockAddr é um parâmetro de resultado que é preenchido com o endereço do soquete de conexão, como conhecido para a camada de comunicações.
Accept é usado com tipos de soquete baseados em conexão, como SOCK_STREAM.
CAsyncSocket::AsyncSelect
Chame essa função de membro para solicitar notificação de evento para um soquete.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.
FD_READDeseja receber notificação de prontidão para leitura.FD_WRITEDeseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.FD_OOBDeseja receber notificação da chegada de dados fora de banda.FD_ACCEPTDeseja receber notificações de conexões de entrada.FD_CONNECTDeseja receber notificação dos resultados da conexão.FD_CLOSEDeseja receber uma notificação quando um soquete for fechado por um par.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEINVALIndica que um dos parâmetros especificados era inválido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.
Observações
Esta função é usada para especificar quais funções de notificação de retorno de chamada MFC serão chamadas para o soquete.
AsyncSelect define automaticamente este soquete para o modo sem bloqueio. Para obter mais informações, consulte o artigo Windows Sockets: Notificações de soquete.
CAsyncSocket::Attach
Chame essa função de membro para anexar o hSocket identificador a um CAsyncSocket objeto.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
hSocket
Contém uma alça para um soquete.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.
FD_READDeseja receber notificação de prontidão para leitura.FD_WRITEDeseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.FD_OOBDeseja receber notificação da chegada de dados fora de banda.FD_ACCEPTDeseja receber notificações de conexões de entrada.FD_CONNECTDeseja receber notificação dos resultados da conexão.FD_CLOSEDeseja receber uma notificação quando um soquete for fechado por um par.
Valor de retorno
Diferente de zero se a função for bem-sucedida.
Observações
O SOCKET identificador é armazenado no membro de dados do m_hSocket objeto.
CAsyncSocket::Bind
Chame essa função de membro para associar um endereço local ao soquete.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parâmetros
nSocketPort
A porta que identifica o aplicativo de soquete.
lpszSocketAddress
O endereço de rede, um número pontilhado como "128.56.22.8". Passar a NULL cadeia de caracteres para esse parâmetro indica que a instância deve escutar a CAsyncSocket atividade do cliente em todas as interfaces de rede.
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que contém o endereço a ser atribuído a esse soquete.
nSockAddrLen
O comprimento do endereço em lpSockAddr bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. A lista a seguir abrange alguns dos erros que podem ser retornados. Para obter uma lista completa, consulte Códigos de erro de soquetes do Windows.
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEADDRINUSEO endereço especificado já está em uso. (Consulte a opção de soqueteSO_REUSEADDRemSetSockOpt.)WSAEFAULTOnSockAddrLenargumento é muito pequeno (menor do que o tamanho de umaSOCKADDRestrutura).WSAEINPROGRESSUma chamada de bloqueio do Windows Sockets está em andamento.WSAEAFNOSUPPORTA família de endereços especificada não é suportada por esta porta.WSAEINVALO soquete já está vinculado a um endereço.WSAENOBUFSNão há buffers suficientes disponíveis, muitas conexões.WSAENOTSOCKO descritor não é um soquete.
Observações
Essa rotina é usada em um datagrama desconectado ou soquete Connect de fluxo, antes de chamadas subsequentesListen. Antes de aceitar solicitações de conexão, um soquete de servidor de escuta deve selecionar um número de porta e torná-lo conhecido ao Windows Sockets chamando Bind.
Bind Estabelece a associação local (endereço do host/número da porta) do soquete atribuindo um nome local a um soquete sem nome.
CAsyncSocket::CAsyncSocket
Constrói um objeto de soquete em branco.
CAsyncSocket();
Observações
Depois de construir o objeto, você deve chamar sua Create função de membro para criar a estrutura de SOCKET dados e vincular seu endereço. (No lado do servidor de uma comunicação do Windows Sockets, quando o soquete de escuta cria um soquete para usar na Accept chamada, você não chama Create esse soquete.)
CAsyncSocket::Close
Fecha o soquete.
virtual void Close();
Observações
Esta função libera o descritor de soquete para que outras referências a ele falhem com o erro WSAENOTSOCK. Se esta for a última referência ao soquete subjacente, as informações de nomenclatura associadas e os dados enfileirados serão descartados. O destruidor do objeto de soquete chama Close por você.
Para CAsyncSocket, mas não para CSocket, a semântica de são afetadas pelas opções Close de SO_LINGER soquete e SO_DONTLINGER. Para obter mais informações, consulte a função GetSockOptde membro .
CAsyncSocket::Connect
Chame essa função de membro para estabelecer uma conexão com um fluxo desconectado ou soquete de datagrama.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parâmetros
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de máquina, como "ftp.microsoft.com", ou um número pontilhado, como "128.56.22.8".
nHostPort
A porta que identifica o aplicativo de soquete.
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que contém o endereço do soquete conectado.
nSockAddrLen
O comprimento do endereço em lpSockAddr bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Se isso indicar um código de erro de , e seu aplicativo estiver usando os retornos de chamada substituíveis, seu aplicativo receberá uma WSAEWOULDBLOCK mensagem quando a operação de OnConnectconexão for concluída. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEADDRINUSEO endereço especificado já está em uso.WSAEINPROGRESSUma chamada de bloqueio do Windows Sockets está em andamento.WSAEADDRNOTAVAILO endereço especificado não está disponível na máquina local.WSAEAFNOSUPPORTOs endereços da família especificada não podem ser usados com esse soquete.WSAECONNREFUSEDA tentativa de conexão foi rejeitada.WSAEDESTADDRREQÉ necessário um endereço de destino.WSAEFAULTOnSockAddrLenargumento está incorreto.WSAEINVALEndereço de host inválido.WSAEISCONNO soquete já está conectado.WSAEMFILENão estão disponíveis mais descritores de ficheiros.WSAENETUNREACHA rede não pode ser acessada a partir deste host no momento.WSAENOBUFSNão há espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTSOCKO descritor não é um soquete.WSAETIMEDOUTA tentativa de conexão atingiu o tempo limite sem estabelecer uma conexão.WSAEWOULDBLOCKO soquete está marcado como sem bloqueio e a conexão não pode ser concluída imediatamente.
Observações
Se o soquete não estiver vinculado, valores exclusivos serão atribuídos à associação local pelo sistema e o soquete será marcado como vinculado. Observe que, se o campo de endereço da estrutura de nomes for todos zeros, Connect retornará zero. Para obter informações de erro estendidas, chame a GetLastError função de membro.
Para soquetes de fluxo (tipo SOCK_STREAM), uma conexão ativa é iniciada com o host estrangeiro. Quando a chamada de soquete for concluída com êxito, o soquete estará pronto para enviar/receber dados.
Para um soquete SOCK_DGRAM de datagrama (tipo Send), um destino padrão é definido, que será usado em chamadas e subsequentesReceive.
CAsyncSocket::Create
Chame a Create função de membro depois de construir um objeto de soquete para criar o soquete do Windows e anexá-lo.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
Parâmetros
nSocketPort
Uma porta bem conhecida para ser usada com o soquete, ou 0 se você quiser que o Windows Sockets selecione uma porta.
nSocketType
SOCK_STREAM ou SOCK_DGRAM.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.
FD_READDeseja receber notificação de prontidão para leitura.FD_WRITEDeseja receber notificação de prontidão para escrever.FD_OOBDeseja receber notificação da chegada de dados fora de banda.FD_ACCEPTDeseja receber notificações de conexões de entrada.FD_CONNECTDeseja receber notificação de conexão concluída.FD_CLOSEDeseja receber notificação de fechamento de soquete.
lpszSockAddress
Um ponteiro para uma cadeia de caracteres que contém o endereço de rede do soquete conectado, um número pontilhado como "128.56.22.8". Passar a NULL cadeia de caracteres para esse parâmetro indica que a instância deve escutar a CAsyncSocket atividade do cliente em todas as interfaces de rede.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEAFNOSUPPORTA família de endereços especificada não é suportada.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEMFILENão estão disponíveis mais descritores de ficheiros.WSAENOBUFSNão há espaço de buffer disponível. O soquete não pode ser criado.WSAEPROTONOSUPPORTA porta especificada não é suportada.WSAEPROTOTYPEA porta especificada é o tipo errado para este soquete.WSAESOCKTNOSUPPORTO tipo de soquete especificado não é suportado nesta família de endereços.
Observações
Create chamadas Socket e, se bem-sucedida, chama Bind para vincular o soquete ao endereço especificado. Os seguintes tipos de soquete são suportados:
SOCK_STREAMFornece fluxos de bytes sequenciados, confiáveis, full-duplex e baseados em conexão. Usa o protocolo TCP (Transmission Control Protocol) para a família de endereços da Internet.SOCK_DGRAMSuporta datagramas, que são pacotes sem conexão e não confiáveis de um comprimento máximo fixo (normalmente pequeno). Usa o UDP (User Datagram Protocol) para a família de endereços da Internet.Observação
A
Acceptfunção member usa uma referência a um novo objeto vazioCSocketcomo parâmetro. Você deve construir este objeto antes de chamarAccept. Lembre-se de que, se esse objeto de soquete sair do escopo, a conexão será fechada. Não chameCreateesse novo objeto de soquete.
Importante
Create
não é seguro para threads. Se você estiver chamando-o em um ambiente multi-threaded onde ele pode ser invocado simultaneamente por threads diferentes, certifique-se de proteger cada chamada com um mutex ou outro bloqueio de sincronização.
Para obter mais informações sobre soquetes de fluxo e datagrama, consulte os artigos Windows Sockets: Plano de fundo e Windows Sockets: portas e endereços de soquete e API do Windows Sockets 2.
CAsyncSocket::CreateEx
Chame a CreateEx função de membro depois de construir um objeto de soquete para criar o soquete do Windows e anexá-lo.
Use esta função quando precisar fornecer opções avançadas, como o tipo de soquete.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
pAI
Um ponteiro para um ADDRINFOT para armazenar informações de soquete, como a família e o tipo de soquete.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.
FD_READDeseja receber notificação de prontidão para leitura.FD_WRITEDeseja receber notificação de prontidão para escrever.FD_OOBDeseja receber notificação da chegada de dados fora de banda.FD_ACCEPTDeseja receber notificações de conexões de entrada.FD_CONNECTDeseja receber notificação de conexão concluída.FD_CLOSEDeseja receber notificação de fechamento de soquete.
Valor de retorno
Consulte o valor de retorno para Create().
Observações
Ver as observações para Create().
CAsyncSocket::Detach
Chame essa função de membro para desanexar o SOCKET identificador no m_hSocket membro de dados do CAsyncSocket objeto e defina m_hSocket como NULL.
SOCKET Detach();
CAsyncSocket::FromHandle
Retorna um ponteiro para um CAsyncSocket objeto.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parâmetros
hSocket
Contém uma alça para um soquete.
Valor de retorno
Um ponteiro para um CAsyncSocket objeto ou NULL se não houver nenhum CAsyncSocket objeto anexado ao hSocket.
Observações
Quando recebe uma SOCKET alça, se um CAsyncSocket objeto não estiver anexado à alça, a função de membro retornará NULL.
CAsyncSocket::GetLastError
Chame essa função de membro para obter o status de erro da última operação que falhou.
static int PASCAL GetLastError();
Valor de retorno
O valor de retorno indica o código de erro para a última rotina de API do Windows Sockets executada por esse thread.
Observações
Quando uma função de membro específica indica que ocorreu um erro, GetLastError deve ser chamado para recuperar o código de erro apropriado. Consulte as descrições das funções de membro individuais para obter uma lista de códigos de erro aplicáveis.
Para obter mais informações sobre os códigos de erro, consulte API do Windows Sockets 2.
CAsyncSocket::GetPeerName
Chame essa função de membro para obter o endereço do soquete de mesmo nível ao qual esse soquete está conectado.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parâmetros
rPeerAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rPeerPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para a SOCKADDR estrutura que recebe o nome do soquete de mesmo nível.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr bytes. Ao retornar, o lpSockAddrLen argumento contém o tamanho real do lpSockAddr retorno em bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento não é suficientemente grande.WSAEINPROGRESSUma chamada de bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.
Observações
Para manipular endereços IPv6, use CAsyncSocket::GetPeerNameEx.
CAsyncSocket::GetPeerNameEx
Chame essa função de membro para obter o endereço do soquete de mesmo nível ao qual esse soquete está conectado (lida com endereços IPv6).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parâmetros
rPeerAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rPeerPort
Referência a um UINT que armazena uma porta.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento não é suficientemente grande.WSAEINPROGRESSUma chamada de bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.
Observações
Esta função é a mesma CAsyncSocket::GetPeerName , exceto que lida com endereços IPv6, bem como protocolos mais antigos.
CAsyncSocket::GetSockName
Chame essa função de membro para obter o nome local de um soquete.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parâmetros
rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rSocketPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que recebe o endereço do soquete.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento não é suficientemente grande.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEINVALO soquete não foi vinculado a um endereço comBind.
Observações
Esta chamada é especialmente útil quando uma Connect chamada foi feita sem fazer uma Bind primeira, esta chamada fornece o único meio pelo qual você pode determinar a associação local que foi definida pelo sistema.
Para manipular endereços IPv6, use CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
Chame essa função de membro para obter o nome local de um soquete (lida com endereços IPv6).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parâmetros
rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rSocketPort
Referência a um UINT que armazena uma porta.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento não é suficientemente grande.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEINVALO soquete não foi vinculado a um endereço comBind.
Observações
Esta chamada é a mesma CAsyncSocket::GetSockName , exceto que ela lida com endereços IPv6, bem como protocolos mais antigos.
Esta chamada é especialmente útil quando uma Connect chamada foi feita sem fazer uma Bind primeira, esta chamada fornece o único meio pelo qual você pode determinar a associação local que foi definida pelo sistema.
CAsyncSocket::GetSockOpt
Chame essa função de membro para recuperar uma opção de soquete.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parâmetros
nOptionName
A opção de soquete para a qual o valor deve ser recuperado.
lpOptionValue
Um ponteiro para o buffer no qual o valor da opção solicitada deve ser retornado. O valor associado à opção selecionada é retornado no buffer lpOptionValue. O inteiro apontado por lpOptionLen deve conter originalmente o tamanho desse buffer em bytes e, no retorno, ele será definido como o tamanho do valor retornado. Para SO_LINGER, este será o tamanho de uma LINGER estrutura, para todas as outras opções será o tamanho de um BOOL ou um int, dependendo da opção. Veja a lista de opções e seus tamanhos na seção Observações.
lpOptionLen
Um ponteiro para o tamanho do lpOptionValue buffer em bytes.
nLevel
O nível a que a opção é definida; os únicos níveis suportados são SOL_SOCKET e IPPROTO_TCP.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Se uma opção nunca foi definida com SetSockOpt, então GetSockOpt retorna o valor padrão para a opção. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpOptionLenargumento era inválido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOPROTOOPTA opção é desconhecida ou não é suportada. Em particular,SO_BROADCASTnão é suportado em soquetes do tipoSOCK_STREAM, enquantoSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE,SO_LINGER, eSO_OOBINLINEnão são suportados em soquetes do tipoSOCK_DGRAM.WSAENOTSOCKO descritor não é um soquete.
Observações
GetSockOpt Recupera o valor atual de uma opção de soquete associada a um soquete de qualquer tipo, em qualquer estado, e armazena o resultado em lpOptionValue. As opções afetam as operações de soquete, como o roteamento de pacotes, transferência de dados fora de banda e assim por diante.
As seguintes opções são suportadas para GetSockOpt. O Tipo identifica o tipo de dados abordados pelo lpOptionValue. A TCP_NODELAY opção usa nível IPPROTO_TCP, todas as outras opções usam nível SOL_SOCKET.
| Valor | Tipo | Significado |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket está ouvindo. |
SO_BROADCAST |
BOOL |
O soquete é configurado para a transmissão de mensagens de difusão. |
SO_DEBUG |
BOOL |
A depuração está ativada. |
SO_DONTLINGER |
BOOL |
Se true, a opção está desativada SO_LINGER . |
SO_DONTROUTE |
BOOL |
O roteamento está desativado. |
SO_ERROR |
int |
Recupere o status do erro e limpe. |
SO_KEEPALIVE |
BOOL |
Keep-alives estão sendo enviados. |
SO_LINGER |
struct LINGER |
Retorna as opções de permanência atuais. |
SO_OOBINLINE |
BOOL |
Dados fora de banda estão sendo recebidos no fluxo de dados normal. |
SO_RCVBUF |
int |
Tamanho do buffer para recebimentos. |
SO_REUSEADDR |
BOOL |
O soquete pode ser vinculado a um endereço que já está em uso. |
SO_SNDBUF |
int |
Tamanho do buffer para envios. |
SO_TYPE |
int |
O tipo de soquete (por exemplo, SOCK_STREAM). |
TCP_NODELAY |
BOOL |
Desativa o algoritmo Nagle para enviar coalescência. |
As opções de Berkeley Software Distribution (BSD) não suportadas são GetSockOpt :
| Valor | Tipo | Significado |
|---|---|---|
SO_RCVLOWAT |
int |
Receba marca d'água baixa. |
SO_RCVTIMEO |
int |
Receba o tempo limite. |
SO_SNDLOWAT |
int |
Envie marca d'água baixa. |
SO_SNDTIMEO |
int |
Tempo limite de envio. |
IP_OPTIONS |
Obter opções no cabeçalho IP. | |
TCP_MAXSEG |
int |
Obtenha o tamanho máximo do segmento TCP. |
Chamar GetSockOpt com uma opção não suportada resultará em um código de erro de WSAENOPROTOOPT ser retornado do GetLastError.
CAsyncSocket::IOCtl
Chame essa função de membro para controlar o modo de um soquete.
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
Parâmetros
lCommand
O comando a ser executado no soquete.
lpArgument
Um ponteiro para um parâmetro para lCommand.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEINVALlCommandnão é um comando válido, oulpArgumentnão é um parâmetro aceitável paralCommand, ou o comando não é aplicável ao tipo de soquete fornecido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.
Observações
Essa rotina pode ser usada em qualquer soquete em qualquer estado. Ele é usado para obter ou recuperar parâmetros operacionais associados ao soquete, independentemente do protocolo e subsistema de comunicações. Os seguintes comandos são suportados:
FIONBIOHabilite ou desative o modo sem bloqueio no soquete. OlpArgumentparâmetro aponta para umDWORD, que é diferente de zero se o modo sem bloqueio deve ser ativado e zero se ele deve ser desativado. SeAsyncSelecttiver sido emitido em um soquete, qualquer tentativa de usarIOCtlpara definir o soquete de volta ao modo de bloqueio falhará comWSAEINVALo . Para definir o soquete de volta ao modo de bloqueio e evitar oWSAEINVALerro, um aplicativo deve primeiro desativarAsyncSelectchamandoAsyncSelectcom olEventparâmetro igual a 0 e, em seguida, chamarIOCtl.FIONREADDetermine o número máximo de bytes que podem ser lidos com umaReceivechamada desse soquete. OlpArgumentparâmetro aponta para umDWORDem queIOCtlarmazena o resultado. Se este soquete for do tipoSOCK_STREAM,FIONREADretorna a quantidade total de dados que podem ser lidos em um únicoReceive, que normalmente é o mesmo que a quantidade total de dados enfileirados no soquete. Se esse soquete for do tipoSOCK_DGRAM,FIONREADretornará o tamanho do primeiro datagrama enfileirado no soquete.SIOCATMARKDetermine se todos os dados fora de banda foram lidos. Isso se aplica apenas a um soquete do tipoSOCK_STREAMque foi configurado para receção em linha de quaisquer dados fora de banda (SO_OOBINLINE). Se nenhum dado fora de banda estiver aguardando para ser lido, a operação retornará diferente de zero. Caso contrário, ele retorna 0, e o próximoReceiveouReceiveFromexecutado no soquete recuperará alguns ou todos os dados anteriores à "marca", o aplicativo deve usar aSIOCATMARKoperação para determinar se algum dado permanece. Se houver algum dado normal que precede os dados "urgentes" (fora de banda), ele será recebido em ordem. (Observe que umReceiveouReceiveFromnunca misturará dados fora de banda e dados normais na mesma chamada.) OlpArgumentparâmetro aponta para umDWORDem queIOCtlarmazena o resultado.
Esta função é um subconjunto de como usado em soquetes de ioctl() Berkeley. Em particular, não há nenhum comando que seja equivalente a FIOASYNC, enquanto SIOCATMARK é o único comando de nível de soquete que é suportado.
CAsyncSocket::Listen
Chame essa função de membro para ouvir solicitações de conexão de entrada.
BOOL Listen(int nConnectionBacklog = 5);
Parâmetros
nConnectionBacklog
O comprimento máximo para o qual a fila de conexões pendentes pode crescer. O intervalo válido é de 1 a 5.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEADDRINUSEFoi feita uma tentativa de ouvir um endereço em uso.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi vinculadoBindou já está conectado.WSAEISCONNO soquete já está conectado.WSAEMFILENão estão disponíveis mais descritores de ficheiros.WSAENOBUFSNão há espaço de buffer disponível.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPO soquete referenciado não é de um tipo que suporta aListenoperação.
Observações
Para aceitar conexões, o soquete é criado primeiro com Create, uma lista de pendências para conexões de entrada é especificada com Listene, em seguida, as conexões são aceitas com Accept.
Listen aplica-se apenas a soquetes que suportam conexões, ou seja, aqueles do tipo SOCK_STREAM. Este soquete é colocado no modo "passivo", onde as conexões de entrada são reconhecidas e enfileiradas aguardando aceitação pelo processo.
Essa função é normalmente usada por servidores (ou qualquer aplicativo que queira aceitar conexões) que podem ter mais de uma solicitação de conexão ao mesmo tempo: se uma solicitação de conexão chegar com a fila cheia, o cliente receberá um erro com uma indicação de WSAECONNREFUSED.
Listen tenta continuar a funcionar racionalmente quando não há portas disponíveis (descritores). Ele aceitará conexões até que a fila seja esvaziada. Se as portas ficarem disponíveis, uma chamada posterior para Listen ou Accept reabastecerá a fila para a "lista de pendências" atual ou mais recente, se possível, e retomará a escuta das conexões de entrada.
CAsyncSocket::m_hSocket
Contém o SOCKET identificador para o soquete encapsulado por este CAsyncSocket objeto.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Chamado pela estrutura para notificar um soquete de escuta de que ele pode aceitar solicitações de conexão pendentes chamando a Accept função de membro.
virtual void OnAccept(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnAccept função de membro:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.
Observações
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnClose
Chamado pela estrutura para notificar esse soquete de que o soquete conectado está fechado por seu processo.
virtual void OnClose(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnClose função de membro:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAECONNRESETA conexão foi redefinida pelo lado remoto.WSAECONNABORTEDA conexão foi abortada devido ao tempo limite ou outra falha.
Observações
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnConnect
Chamado pela estrutura para notificar esse soquete de conexão de que sua tentativa de conexão foi concluída, seja com êxito ou por engano.
virtual void OnConnect(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnConnect função de membro:
0 A função executada com êxito.
WSAEADDRINUSEO endereço especificado já está em uso.WSAEADDRNOTAVAILO endereço especificado não está disponível na máquina local.WSAEAFNOSUPPORTOs endereços da família especificada não podem ser usados com esse soquete.WSAECONNREFUSEDA tentativa de conexão foi rejeitada com força.WSAEDESTADDRREQÉ necessário um endereço de destino.WSAEFAULTOlpSockAddrLenargumento está incorreto.WSAEINVALO soquete já está vinculado a um endereço.WSAEISCONNO soquete já está conectado.WSAEMFILENão estão disponíveis mais descritores de ficheiros.WSAENETUNREACHA rede não pode ser acessada a partir deste host no momento.WSAENOBUFSNão há espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor é um arquivo, não um soquete.WSAETIMEDOUTA tentativa de conexão expirou sem estabelecer uma conexão.
Observações
Observação
No CSocket, a função de OnConnect notificação nunca é chamada. Para conexões, basta ligar para Connect, que retornará quando a conexão for concluída (com êxito ou por engano). Como as notificações de conexão são tratadas é um detalhe de implementação do MFC.
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
if (0 != nErrorCode)
{
switch (nErrorCode)
{
case WSAEADDRINUSE:
AfxMessageBox(_T("The specified address is already in use.\n"));
break;
case WSAEADDRNOTAVAIL:
AfxMessageBox(_T("The specified address is not available from ")
_T("the local machine.\n"));
break;
case WSAEAFNOSUPPORT:
AfxMessageBox(_T("Addresses in the specified family cannot be ")
_T("used with this socket.\n"));
break;
case WSAECONNREFUSED:
AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
break;
case WSAEDESTADDRREQ:
AfxMessageBox(_T("A destination address is required.\n"));
break;
case WSAEFAULT:
AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
break;
case WSAEINVAL:
AfxMessageBox(_T("The socket is already bound to an address.\n"));
break;
case WSAEISCONN:
AfxMessageBox(_T("The socket is already connected.\n"));
break;
case WSAEMFILE:
AfxMessageBox(_T("No more file descriptors are available.\n"));
break;
case WSAENETUNREACH:
AfxMessageBox(_T("The network cannot be reached from this host ")
_T("at this time.\n"));
break;
case WSAENOBUFS:
AfxMessageBox(_T("No buffer space is available. The socket ")
_T("cannot be connected.\n"));
break;
case WSAENOTCONN:
AfxMessageBox(_T("The socket is not connected.\n"));
break;
case WSAENOTSOCK:
AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
break;
case WSAETIMEDOUT:
AfxMessageBox(_T("The attempt to connect timed out without ")
_T("establishing a connection. \n"));
break;
default:
TCHAR szError[256];
_stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
AfxMessageBox(szError);
break;
}
AfxMessageBox(_T("Please close the application"));
}
CAsyncSocket::OnConnect(nErrorCode);
}
CAsyncSocket::OnOutOfBandData
Chamado pela estrutura para notificar o soquete de recebimento de que o soquete de envio tem dados fora de banda para enviar.
virtual void OnOutOfBandData(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnOutOfBandData função de membro:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.
Observações
Dados fora de banda são um canal logicamente independente que está associado a cada par de soquetes conectados do tipo SOCK_STREAM. O canal é geralmente usado para enviar dados urgentes.
MFC suporta dados fora de banda, mas os usuários de classe CAsyncSocket são desencorajados de usá-lo. A maneira mais fácil é criar um segundo soquete para passar esses dados. Para obter mais informações sobre dados fora de banda, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnReceive
Chamado pela estrutura para notificar esse soquete de que há dados no buffer que podem ser recuperados chamando a Receive função de membro.
virtual void OnReceive(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnReceive função de membro:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.
Observações
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
static int i = 0;
i++;
TCHAR buff[4096];
int nRead;
nRead = Receive(buff, 4096);
switch (nRead)
{
case 0:
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
AfxMessageBox(_T("Error occurred"));
Close();
}
break;
default:
buff[nRead] = _T('\0'); //terminate the string
CString szTemp(buff);
m_strRecv += szTemp; // m_strRecv is a CString declared
// in CMyAsyncSocket
if (szTemp.CompareNoCase(_T("bye")) == 0)
{
ShutDown();
s_eventDone.SetEvent();
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
CAsyncSocket::OnSend
Chamado pela estrutura para notificar o soquete que agora pode enviar dados chamando a Send função de membro.
virtual void OnSend(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnSend função de membro:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.
Observações
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
// CString m_sendBuffer; //for async send
// int m_nBytesSent;
// int m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
while (m_nBytesSent < m_nBytesBufferSize)
{
int dwBytes;
if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
break;
}
else
{
TCHAR szError[256];
_stprintf_s(szError, _T("Server Socket failed to send: %d"),
GetLastError());
Close();
AfxMessageBox(szError);
}
}
else
{
m_nBytesSent += dwBytes;
}
}
if (m_nBytesSent == m_nBytesBufferSize)
{
m_nBytesSent = m_nBytesBufferSize = 0;
m_sendBuffer = _T("");
}
CAsyncSocket::OnSend(nErrorCode);
}
CAsyncSocket::operator =
Atribui um novo valor a um CAsyncSocket objeto.
void operator=(const CAsyncSocket& rSrc);
Parâmetros
rSrc
Uma referência a um objeto existente CAsyncSocket .
Observações
Chame essa função para copiar um objeto existente CAsyncSocket para outro CAsyncSocket objeto.
CAsyncSocket::operator SOCKET
Use este operador para recuperar o SOCKETCAsyncSocket identificador do objeto.
operator SOCKET() const;
Valor de retorno
Se for bem-sucedido, o identificador do SOCKET objeto, caso contrário, NULL.
Observações
Você pode usar o identificador para chamar APIs do Windows diretamente.
CAsyncSocket::Receive
Chame essa função de membro para receber dados de um soquete.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados recebidos.
nBufLen
O comprimento de lpBuf em bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_PEEKEspreite os dados recebidos. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se não ocorrer nenhum erro, Receive devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAENOTCONNO soquete não está conectado.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarReceiveum soquete depoisShutDownde ter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e aReceiveoperação bloquearia.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAEINVALO soquete não foi vinculado aoBind.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.
Observações
Esta função é usada para soquetes de fluxo ou datagrama conectados e é usada para ler dados de entrada.
Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido.
Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte do datagrama, os dados em excesso serão perdidos e Receive retornarão um valor de com o código de SOCKET_ERROR erro definido como WSAEMSGSIZE. Se nenhum dado de entrada estiver disponível no soquete, um valor de será retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. A OnReceive função de retorno de chamada pode ser usada para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um Receive será concluído imediatamente com 0 bytes recebidos. Se a conexão tiver sido redefinida, um Receive falhará com o erro WSAECONNRESET.
Receive deve ser chamado apenas uma vez para cada vez CAsyncSocket::OnReceive que é chamado.
Exemplo
Veja o exemplo para CAsyncSocket::OnReceive.
CAsyncSocket::ReceiveFrom
Chame essa função de membro para receber um datagrama e armazenar o endereço de origem na SOCKADDR estrutura ou no rSocketAddress.
int ReceiveFrom(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
int ReceiveFrom(
void* lpBuf,
int nBufLen,
SOCKADDR* lpSockAddr,
int* lpSockAddrLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados recebidos.
nBufLen
O comprimento de lpBuf em bytes.
rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rSocketPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que mantém o endereço de origem no retorno.
lpSockAddrLen
Um ponteiro para o comprimento do endereço de origem em lpSockAddr bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_PEEKEspreite os dados recebidos. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se não ocorrer nenhum erro, ReceiveFrom devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento era inválido: olpSockAddrbuffer era muito pequeno para acomodar o endereço de mesmo nível.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi vinculado aoBind.WSAENOTCONNO soquete não está conectado (SOCK_STREAMapenas).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarReceiveFromum soquete depoisShutDownde ter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e aReceiveFromoperação bloquearia.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.
Observações
Esta função é usada para ler dados recebidos em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.
Para manipular endereços IPv6, use CAsyncSocket::ReceiveFromEx.
Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido. Os lpSockAddr parâmetros e lpSockAddrLen são ignorados para SOCK_STREAM soquetes.
Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, os dados em excesso serão perdidos e ReceiveFrom retornará um valor de com o código de SOCKET_ERROR erro definido como WSAEMSGSIZE.
Se lpSockAddr for diferente de zero, e o soquete for do tipo SOCK_DGRAM, o endereço de rede do soquete que enviou os dados é copiado para a estrutura correspondente SOCKADDR . O valor apontado por lpSockAddrLen é inicializado para o tamanho dessa estrutura e é modificado no retorno para indicar o tamanho real do endereço armazenado lá. Se nenhum dado de entrada estiver disponível no soquete, a ReceiveFrom chamada aguardará a chegada dos dados, a menos que o soquete não esteja bloqueando. Nesse caso, um valor de é retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. O OnReceive retorno de chamada pode ser usado para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um ReceiveFrom será concluído imediatamente com 0 bytes recebidos.
CAsyncSocket::ReceiveFromEx
Chame essa função de membro para receber um datagrama e armazenar o endereço de origem na SOCKADDR estrutura ou em rSocketAddress (lida com endereços IPv6).
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados recebidos.
nBufLen
O comprimento de lpBuf em bytes.
rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.
rSocketPort
Referência a um UINT que armazena uma porta.
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_PEEKEspreite os dados recebidos. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se não ocorrer nenhum erro, ReceiveFromEx devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTOlpSockAddrLenargumento era inválido: olpSockAddrbuffer era muito pequeno para acomodar o endereço de mesmo nível.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi vinculado aoBind.WSAENOTCONNO soquete não está conectado (SOCK_STREAMapenas).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarReceiveFromExum soquete depoisShutDownde ter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e aReceiveFromExoperação bloquearia.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.
Observações
Esta função é usada para ler dados recebidos em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.
Esta função é a mesma CAsyncSocket::ReceiveFrom , exceto que lida com endereços IPv6, bem como protocolos mais antigos.
Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido. Os lpSockAddr parâmetros e lpSockAddrLen são ignorados para SOCK_STREAM soquetes.
Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, os dados em excesso serão perdidos e ReceiveFromEx retornará um valor de com o código de SOCKET_ERROR erro definido como WSAEMSGSIZE.
Se lpSockAddr for diferente de zero, e o soquete for do tipo SOCK_DGRAM, o endereço de rede do soquete que enviou os dados é copiado para a estrutura correspondente SOCKADDR . O valor apontado por lpSockAddrLen é inicializado para o tamanho dessa estrutura e é modificado no retorno para indicar o tamanho real do endereço armazenado lá. Se nenhum dado de entrada estiver disponível no soquete, a ReceiveFromEx chamada aguardará a chegada dos dados, a menos que o soquete não esteja bloqueando. Nesse caso, um valor de é retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. O OnReceive retorno de chamada pode ser usado para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um ReceiveFromEx será concluído imediatamente com 0 bytes recebidos.
CAsyncSocket::Send
Chame essa função de membro para enviar dados em um soquete conectado.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer contendo os dados a serem transmitidos.
nBufLen
O comprimento dos dados em lpBuf bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnvie dados fora de banda (SOCK_STREAMapenas).
Valor de retorno
Se não ocorrer nenhum erro, Send devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTOlpBufargumento não está em uma parte válida do espaço de endereço do usuário.WSAENETRESETA conexão deve ser redefinida porque a implementação do Windows Sockets a descartou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarSendum soquete depoisShutDownde ter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e a operação solicitada bloquearia.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAEINVALO soquete não foi vinculado aoBind.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.
Observações
Send é usado para gravar dados de saída em soquetes de fluxo ou datagrama conectados. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é dado pelo iMaxUdpDg elemento na WSADATA estrutura retornado pelo AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado via GetLastError, e nenhum dado será transmitido.
Observe que, para um soquete de datagrama, a conclusão bem-sucedida de um Send não indica que os dados foram entregues com êxito.
Em CAsyncSocket objetos do tipo SOCK_STREAM, o número de bytes gravados pode estar entre 1 e o comprimento solicitado, dependendo da disponibilidade do buffer nos hosts locais e estrangeiros.
Exemplo
Veja o exemplo para CAsyncSocket::OnSend.
CAsyncSocket::SendTo
Chame essa função de membro para enviar dados para um destino específico.
int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer contendo os dados a serem transmitidos.
nBufLen
O comprimento dos dados em lpBuf bytes.
nHostPort
A porta que identifica o aplicativo de soquete.
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de máquina como "ftp.microsoft.com" ou um número pontilhado como "128.56.22.8".
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnvie dados fora de banda (SOCK_STREAMapenas).
lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que contém o endereço do soquete de destino.
nSockAddrLen
O comprimento do endereço em lpSockAddr bytes.
Valor de retorno
Se não ocorrer nenhum erro, SendTo devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTOslpBufparâmetros oulpSockAddrnão fazem parte do espaço de endereçamento do usuário ou olpSockAddrargumento é muito pequeno (menor que o tamanho de umaSOCKADDRestrutura).WSAEINVALO nome do host é inválido.WSAENETRESETA conexão deve ser redefinida porque a implementação do Windows Sockets a descartou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado (SOCK_STREAMapenas).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarSendToum soquete depoisShutDownde ter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e a operação solicitada bloquearia.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.WSAEADDRNOTAVAILO endereço especificado não está disponível na máquina local.WSAEAFNOSUPPORTOs endereços da família especificada não podem ser usados com esse soquete.WSAEDESTADDRREQÉ necessário um endereço de destino.WSAENETUNREACHA rede não pode ser acessada a partir deste host no momento.
Observações
SendTo é usado em datagrama ou soquetes de fluxo e é usado para gravar dados de saída em um soquete. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é dado pelo iMaxUdpDg elemento na WSADATA estrutura preenchida por AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado e nenhum dado será transmitido.
Observe que a conclusão bem-sucedida de um SendTo não indica que os dados foram entregues com êxito.
SendTo é usado apenas em um SOCK_DGRAM soquete para enviar um datagrama para um soquete lpSockAddr específico identificado pelo parâmetro.
Para enviar uma transmissão (em um SOCK_DGRAM apenas), o lpSockAddr endereço no parâmetro deve ser construído usando o endereço INADDR_BROADCAST IP especial (definido no arquivo WINSOCK.Hde cabeçalho do Windows Sockets) juntamente com o número da porta pretendida. Ou, se o lpszHostAddress parâmetro for NULL, o soquete está configurado para difusão. Geralmente, não é aconselhável que um datagrama de difusão exceda o tamanho no qual a fragmentação pode ocorrer, o que implica que a parte de dados do datagrama (excluindo cabeçalhos) não deve exceder 512 bytes.
Para manipular endereços IPv6, use CAsyncSocket::SendToEx.
CAsyncSocket::SendToEx
Chame essa função de membro para enviar dados para um destino específico (lida com endereços IPv6).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer contendo os dados a serem transmitidos.
nBufLen
O comprimento dos dados em lpBuf bytes.
nHostPort
A porta que identifica o aplicativo de soquete.
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de máquina como "ftp.microsoft.com" ou um número pontilhado como "128.56.22.8".
nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnvie dados fora de banda (SOCK_STREAMapenas).
Valor de retorno
Se não ocorrer nenhum erro, SendToEx devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTOslpBufparâmetros oulpSockAddrnão fazem parte do espaço de endereçamento do usuário ou olpSockAddrargumento é muito pequeno (menor que o tamanho de umaSOCKADDRestrutura).WSAEINVALO nome do host é inválido.WSAENETRESETA conexão deve ser redefinida porque a implementação do Windows Sockets a descartou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado (SOCK_STREAMapenas).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNA tomada foi desligada; Não é possível chamarSendToExum soquete depoisShutDownde ter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete está marcado como não bloqueando e a operação solicitada bloquearia.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTEDO circuito virtual foi abortado devido a tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi reiniciado pelo lado remoto.WSAEADDRNOTAVAILO endereço especificado não está disponível na máquina local.WSAEAFNOSUPPORTOs endereços da família especificada não podem ser usados com esse soquete.WSAEDESTADDRREQÉ necessário um endereço de destino.WSAENETUNREACHA rede não pode ser acessada a partir deste host no momento.
Observações
Este método é o mesmo CAsyncSocket::SendTo , exceto que ele lida com endereços IPv6, bem como protocolos mais antigos.
SendToEx é usado em datagrama ou soquetes de fluxo e é usado para gravar dados de saída em um soquete. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é dado pelo iMaxUdpDg elemento na WSADATA estrutura preenchida por AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado e nenhum dado será transmitido.
Observe que a conclusão bem-sucedida de um SendToEx não indica que os dados foram entregues com êxito.
SendToEx é usado apenas em um SOCK_DGRAM soquete para enviar um datagrama para um soquete lpSockAddr específico identificado pelo parâmetro.
Para enviar uma transmissão (em um SOCK_DGRAM apenas), o lpSockAddr endereço no parâmetro deve ser construído usando o endereço INADDR_BROADCAST IP especial (definido no arquivo WINSOCK.Hde cabeçalho do Windows Sockets) juntamente com o número da porta pretendida. Ou, se o lpszHostAddress parâmetro for NULL, o soquete está configurado para difusão. Geralmente, não é aconselhável que um datagrama de difusão exceda o tamanho no qual a fragmentação pode ocorrer, o que implica que a parte de dados do datagrama (excluindo cabeçalhos) não deve exceder 512 bytes.
CAsyncSocket::SetSockOpt
Chame essa função de membro para definir uma opção de soquete.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parâmetros
nOptionName
A opção de soquete para a qual o valor deve ser definido.
lpOptionValue
Um ponteiro para o buffer no qual o valor para a opção solicitada é fornecido.
nOptionLen
O tamanho do lpOptionValue buffer em bytes.
nLevel
O nível a que a opção é definida; os únicos níveis suportados são SOL_SOCKET e IPPROTO_TCP.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEFAULTlpOptionValuenão está em uma parte válida do espaço de endereçamento do processo.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALnLevelnão é válida, ou as informações contidas nãolpOptionValuesão válidas.WSAENETRESETA conexão expirou quandoSO_KEEPALIVEestá definida.WSAENOPROTOOPTA opção é desconhecida ou não é suportada. Em particular,SO_BROADCASTnão é suportado em soquetes do tipoSOCK_STREAM, enquantoSO_DONTLINGER,SO_KEEPALIVE,SO_LINGEReSO_OOBINLINEnão são suportados em soquetes do tipoSOCK_DGRAM.WSAENOTCONNA conexão foi redefinida quandoSO_KEEPALIVEestá definida.WSAENOTSOCKO descritor não é um soquete.
Observações
SetSockOpt Define o valor atual para uma opção de soquete associada a um soquete de qualquer tipo, em qualquer estado. Embora as opções possam existir em vários níveis de protocolo, essa especificação define apenas as opções que existem no nível mais alto de "soquete". As opções afetam as operações de soquete, como se os dados acelerados são recebidos no fluxo de dados normal, se as mensagens de difusão podem ser enviadas no soquete e assim por diante.
Há dois tipos de opções de soquete: opções booleanas que habilitam ou desabilitam um recurso ou comportamento e opções que exigem um valor inteiro ou estrutura. Para habilitar uma opção booleana, lpOptionValue aponta para um inteiro diferente de zero. Para desativar a opção lpOptionValue aponta para um inteiro igual a zero.
nOptionLen deve ser igual às sizeof(BOOL) opções booleanas. Para outras opções, lpOptionValue aponta para o inteiro ou estrutura que contém o valor desejado para a opção e nOptionLen é o comprimento do inteiro ou estrutura.
SO_LINGER Controla a ação executada quando dados não enviados são enfileirados em um soquete e a Close função é chamada para fechar o soquete.
Por padrão, um soquete não pode ser vinculado (consulte Bind) a um endereço local que já esteja em uso. Por vezes, porém, pode ser desejável "reutilizar" um endereço desta forma. Como cada conexão é identificada exclusivamente pela combinação de endereços locais e remotos, não há problema em ter dois soquetes vinculados ao mesmo endereço local, desde que os endereços remotos sejam diferentes.
Para informar a implementação do Windows Sockets de que uma Bind chamada em um soquete não deve ser desautorizada porque o endereço desejado já está em uso por outro soquete, o aplicativo deve definir a opção de soquete SO_REUSEADDR para o soquete antes de emitir a Bind chamada. Observe que a opção é interpretada apenas no momento da Bind chamada: portanto, é desnecessário (mas inofensivo) definir a opção em um soquete que não deve ser vinculado a um endereço existente, e definir ou redefinir a opção após a Bind chamada não tem efeito sobre este ou qualquer outro soquete.
Um aplicativo pode solicitar que a implementação do Windows Sockets habilite o uso de pacotes "keep-alive" em conexões TCP (Transmission Control Protocol) ativando a SO_KEEPALIVE opção de soquete. Uma implementação do Windows Sockets não precisa suportar o uso de keep-alives: se isso acontecer, a semântica precisa é específica da implementação, mas deve estar em conformidade com a seção 4.2.3.6 da RFC 1122: "Requisitos para hosts da Internet — camadas de comunicação". Se uma conexão for interrompida como resultado de "keep-alives", o código WSAENETRESET de erro será retornado para todas as chamadas em andamento no soquete, e todas as chamadas subsequentes falharão com WSAENOTCONNo .
A TCP_NODELAY opção desativa o algoritmo Nagle. O algoritmo Nagle é usado para reduzir o número de pequenos pacotes enviados por um host armazenando em buffer dados de envio não reconhecidos até que um pacote de tamanho completo possa ser enviado. No entanto, para alguns aplicativos, esse algoritmo pode impedir o desempenho e TCP_NODELAY pode ser usado para desativá-lo. Os criadores de aplicativos não devem definir TCP_NODELAY a menos que o impacto de fazê-lo seja bem compreendido e desejado, uma vez que a configuração TCP_NODELAY pode ter um impacto negativo significativo no desempenho da rede.
TCP_NODELAY é a única opção de soquete suportada que usa nível IPPROTO_TCP, todas as outras opções usam nível SOL_SOCKET.
Algumas implementações do Windows Sockets fornecem informações de depuração de saída se a SO_DEBUG opção for definida por um aplicativo.
As seguintes opções são suportadas para SetSockOpt. O Tipo identifica o tipo de dados abordados pelo lpOptionValue.
| Valor | Tipo | Significado |
|---|---|---|
SO_BROADCAST |
BOOL |
Permitir a transmissão de mensagens de difusão no soquete. |
SO_DEBUG |
BOOL |
Registre informações de depuração. |
SO_DONTLINGER |
BOOL |
Não bloqueie Close a espera pelo envio de dados não enviados. Definir esta opção é equivalente a definir SO_LINGER com l_onoff definido como zero. |
SO_DONTROUTE |
BOOL |
Não encaminhe: envie diretamente para a interface. |
SO_KEEPALIVE |
BOOL |
Envie keep-alives. |
SO_LINGER |
struct LINGER |
Aguarde Close se os dados não enviados estiverem presentes. |
SO_OOBINLINE |
BOOL |
Receba dados fora de banda no fluxo de dados normal. |
SO_RCVBUF |
int |
Especifique o tamanho do buffer para recebimentos. |
SO_REUSEADDR |
BOOL |
Permita que o soquete seja vinculado a um endereço que já esteja em uso. (Consulte Ligação.) |
SO_SNDBUF |
int |
Especifique o tamanho do buffer para envios. |
TCP_NODELAY |
BOOL |
Desativa o algoritmo Nagle para enviar coalescência. |
As opções de Berkeley Software Distribution (BSD) não suportadas são SetSockOpt :
| Valor | Tipo | Significado |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
O soquete está ouvindo |
SO_ERROR |
int |
Obtenha o status do erro e limpe. |
SO_RCVLOWAT |
int |
Receba marca d'água baixa. |
SO_RCVTIMEO |
int |
Tempo limite de recebimento |
SO_SNDLOWAT |
int |
Envie marca d'água baixa. |
SO_SNDTIMEO |
int |
Tempo limite de envio. |
SO_TYPE |
int |
Tipo de soquete. |
IP_OPTIONS |
Definir campo de opções no cabeçalho IP. |
CAsyncSocket::ShutDown
Chame essa função de membro para desabilitar envios, recebimentos ou ambos no soquete.
BOOL ShutDown(int nHow = sends);
Parâmetros
nHow
Um sinalizador que descreve quais tipos de operação não serão mais permitidos, usando os seguintes valores enumerados:
recebe = 0
envios = 1
ambos = 2
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0, e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:
WSANOTINITIALISEDUm êxitoAfxSocketInitdeve ocorrer antes de usar esta API.WSAENETDOWNA implementação do Windows Sockets detetou que o subsistema de rede falhou.WSAEINVALnHownão é válida.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado (SOCK_STREAMapenas).WSAENOTSOCKO descritor não é um soquete.
Observações
ShutDown é usado em todos os tipos de tomadas para desativar a receção, transmissão ou ambos. Se nHow for 0, os recebimentos subsequentes no soquete não serão permitidos. Isso não tem efeito nas camadas de protocolo inferiores.
Para TCP (Transmission Control Protocol), a janela TCP não é alterada e os dados recebidos serão aceitos (mas não reconhecidos) até que a janela se esgote. Para UDP (User Datagram Protocol), os datagramas de entrada são aceitos e enfileirados. Em nenhum caso será gerado um pacote de erro ICMP. Se nHow for 1, os envios subsequentes não serão permitidos. Para soquetes TCP, um FIN será enviado. A configuração nHow como 2 desativa os envios e os recebimentos conforme descrito acima.
Observe que não fecha o soquete e os recursos conectados ao soquete não serão liberados até ShutDown que Close seja chamado. Um aplicativo não deve depender da capacidade de reutilizar um soquete depois que ele for desligado. Em particular, uma implementação do Windows Sockets não é necessária para suportar o uso de Connect tal soquete.
Exemplo
Veja o exemplo para CAsyncSocket::OnReceive.
CASyncSocket::Socket
Aloca uma alça de soquete.
BOOL Socket(
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0,
int nAddressFormat = PF_INET);
Parâmetros
nSocketType
Especifica SOCK_STREAM ou SOCK_DGRAM.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.
FD_READ: Deseja receber notificação de prontidão para leitura.FD_WRITE: Deseja receber notificação de prontidão para escrever.FD_OOB: Deseja receber notificação da chegada de dados fora de banda.FD_ACCEPT: Deseja receber notificações de conexões de entrada.FD_CONNECT: Deseja receber notificação de conexão concluída.FD_CLOSE: Deseja receber notificação de fechamento de soquete.
nProtocolType
Protocolo a ser usado com o soquete específico para a família de endereços indicada.
nAddressFormat
Especificação da família de endereços.
Valor de retorno
Retorna TRUE no sucesso, FALSE no fracasso.
Observações
Este método aloca um identificador de soquete. Ele não chama CAsyncSocket::Bind para vincular o soquete a um endereço especificado, então você precisa ligar Bind mais tarde para vincular o soquete a um endereço especificado. Você pode usar CAsyncSocket::SetSockOpt para definir a opção de soquete antes que ela seja vinculada.
Ver também
CObject Classe
Gráfico de Hierarquia
CSocket Classe
CSocketFile Classe