Você está offline; aguardando reconexão

Como usar getsockopt e setsockopt no Visual Basic

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 237688
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
Este artigo demonstra como usar as funções de getsockopt e setsockopt Windows Sockets (Winsock) no Visual Basic para ler e definir opções em um soquete. Um parâmetro específico que é válido para protocolo tipo do soquete pode ser ler ou definir passando um identificador de soquete para essas funções juntamente com um nível de opção e nome de opção. O soquete obtido por meio da função Winsock soquete ou até mesmo do Controlo Winsock identificador de soquete (exposto por meio da propriedade identificador do soquete ) pode ser usado (como mostrado aqui).
Mais Informações
Como regra geral, ao chamar funções C no Visual Basic, a constantes relevantes, estruturas (tipos) e protótipos funcionais devem ser redefinidos ou declarados. Isso também é o caso com a API do Winsock. Este exemplo mostra como configurar as funções e constantes, ler todas as opções soquete disponíveis e defina as duas opções soquete relevantes para um protocolo específico.

O aplicativo de exemplo contém dois botões, Command1 e Command2, que ler e definir valores, respectivamente. O exemplo também contém um controle Winsock, Winsock1, para fornecer um identificador de soquete. Observe que o Controlo Winsock da deve ser em um estado ligação para poder definir as opções no soquete. Em outras palavras, a propriedade Winsock1.SocketHandle deve ter um valor maior que zero. Que é tratado no evento Form_Load.

Algumas opções de soquete requerem das estruturas a serem passados ao obter ou definir informações de um soquete. SO_LINGER é como uma opção e é ilustrado no código exemplo a seguir.

Se uma opção não é suportada para um soquete específico ou tipo de soquete, será retornado o erro 10042 (WSAENOPROTOOPT).
Option Explicit' Error returned by Winsock API.Const SOCKET_ERROR = -1' Level number for (get/set)sockopt() to apply to socket itself.Const SOL_SOCKET = 65535      ' Options for socket level.Const IPPROTO_TCP = 6         ' Protocol constant for TCP.' option flags per socketConst SO_DEBUG = &H1&         ' Turn on debugging info recordingConst SO_ACCEPTCONN = &H2&    ' Socket has had listen() - READ-ONLY.Const SO_REUSEADDR = &H4&     ' Allow local address reuse.Const SO_KEEPALIVE = &H8&     ' Keep connections alive.Const SO_DONTROUTE = &H10&    ' Just use interface addresses.Const SO_BROADCAST = &H20&    ' Permit sending of broadcast msgs.Const SO_USELOOPBACK = &H40&  ' Bypass hardware when possible.Const SO_LINGER = &H80&       ' Linger on close if data present.Const SO_OOBINLINE = &H100&   ' Leave received OOB data in line.Const SO_DONTLINGER = Not SO_LINGERConst SO_EXCLUSIVEADDRUSE = Not SO_REUSEADDR ' Disallow local address reuse.' Additional options.Const SO_SNDBUF = &H1001&     ' Send buffer size.Const SO_RCVBUF = &H1002&     ' Receive buffer size.Const SO_ERROR = &H1007&      ' Get error status and clear.Const SO_TYPE = &H1008&       ' Get socket type - READ-ONLY.' TCP OptionsConst TCP_NODELAY = &H1&      ' Turn off Nagel Algorithm.' linger structurePrivate Type LINGER_STRUCT  l_onoff As Integer          ' Is linger on or off?  l_linger As Integer         ' Linger timeout in seconds.End Type ' Winsock API declaresPrivate Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As LongPrivate Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As LongPrivate Sub Command1_Click()  ' Read all the options and present in a message box.  Dim socket As Long    socket = Winsock1.SocketHandle    If socket = 0 Then    MsgBox "No Socket"  Else    MsgBox "Socket Options:" & vbCrLf & _           "    SO_DEBUG: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DEBUG)) & vbCrLf & _           "    SO_ACCEPTCONN: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ACCEPTCONN)) & vbCrLf & _           "    SO_REUSEADDR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_REUSEADDR)) & vbCrLf & _           "    SO_KEEPALIVE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_KEEPALIVE)) & vbCrLf & _           "    SO_DONTROUTE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTROUTE)) & vbCrLf & _           "    SO_BROADCAST: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_BROADCAST)) & vbCrLf & _           "    SO_USELOOPBACK: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_USELOOPBACK)) & vbCrLf & _           "    SO_LINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_LINGER)) & vbCrLf & _           "    SO_OOBINLINE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_OOBINLINE)) & vbCrLf & _           "    SO_DONTLINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTLINGER)) & vbCrLf & _           "    SO_EXCLUSIVEADDRUSE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_EXCLUSIVEADDRUSE)) & vbCrLf & _           "    SO_SNDBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_SNDBUF)) & vbCrLf & _           "    SO_RCVBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_RCVBUF)) & vbCrLf & _           "    SO_ERROR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ERROR)) & vbCrLf & _           "    SO_TYPE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_TYPE)) & vbCrLf & vbCrLf & _           "TCP Options:" & vbCrLf & _           "    TCP_NODELAY: " & CStr(GetSocketOption(socket, IPPROTO_TCP, TCP_NODELAY))    End IfEnd SubPrivate Sub Command2_Click()  Dim lResult As Long     ' Results of 1st option.  Dim lResult2 As Long    ' Results of 2nd option.  Dim linger As LINGER_STRUCT    If (Winsock1.Protocol = sckTCPProtocol) Then    ' Change two options valid for TCP Sockets.    lResult = setsockopt(Winsock1.SocketHandle, IPPROTO_TCP, TCP_NODELAY, 1, 4)    If (lResult = SOCKET_ERROR) Then      MsgBox "Error setting TCP_NODELAY option: " & CStr(Err.LastDllError)    End If        ' Set up the linger structure.    linger.l_onoff = 1    linger.l_linger = 5    lResult2 = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_LINGER, linger, LenB(linger))    If (lResult2 = SOCKET_ERROR) Then      MsgBox "Error setting SO_LINGER option: " & CStr(Err.LastDllError)    End If  Else    ' Change two options valid for UDP sockets.    lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_REUSEADDR, 1, 4)    If (lResult = SOCKET_ERROR) Then      MsgBox "Error setting SO_REUSEADDR option: " & CStr(Err.LastDllError)    End If    lResult2 = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_BROADCAST, 0, 4)    If (lResult2 = SOCKET_ERROR) Then      MsgBox "Error setting SO_BROADCAST option: " & CStr(Err.LastDllError)    End If  End If    If (lResult = 0) And (lResult2 = 0) Then    MsgBox "Options Set"  End IfEnd SubPublic Function GetSocketOption(lSocket As Long, lLevel As Long, lOption As Long) As Long  Dim lResult As Long       ' Result of API call.  Dim lBuffer As Long       ' Buffer to get value into.  Dim lBufferLen As Long    ' len of buffer.  Dim linger As LINGER_STRUCT    ' Linger requires a structure so we will get that option differently.  If (lOption <> SO_LINGER) And (lOption <> SO_DONTLINGER) Then    lBufferLen = LenB(lBuffer)    lResult = getsockopt(lSocket, lLevel, lOption, lBuffer, lBufferLen)  Else    lBufferLen = LenB(linger)    lResult = getsockopt(lSocket, lLevel, lOption, linger, lBufferLen)    lBuffer = linger.l_onoff  End If    If (lResult = SOCKET_ERROR) Then    GetSocketOption = Err.LastDllError  Else    GetSocketOption = lBuffer  End IfEnd FunctionPrivate Sub Form_Load()  Winsock1.Bind 8377      ' Set up socket enough to get nonzero socket. handleEnd Sub				
Referências
  • Documentação SDK de plataforma para a API do Windows Sockets versão 2
  • Documentação do Visual Basic para Visual Basic e o Controlo Winsock da
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
110219LONG: Como chamada de API do Windows a partir do VB 3.0--diretrizes gerais
106553COMO: Gravar DLLs C e chamada-los a partir do Visual Basic

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 237688 - Última Revisão: 11/21/2006 15:47:31 - Revisão: 4.1

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbdswnet2003swept kbapi kbctrl kbhowto kbnetwork kbwinsock KB237688 KbMtpt
Comentários
d"; document.getElementsByTagName("head")[0].appendChild(m);