Newsgroup: it.comp.lang.visual-basic
Titolo: Multicast e TTL

Stò utilizzando Winsock per mandare dei multicast e ho scoperto che il
valore di default del TTL è 1 e per cambiare questo valore non basta il
controllo ocx ma bisogna andare a scomodare una funzione della dll
wsock32.
Ho cercato varie informazioni in giro, ma in pochi hanno affrontato
questo problema...specialmente in Visual Basic.
Per settare qualunque parametro del socket si utilizza la funzione
setsockopt: ogni opzione ha un livello.
Il parametro per settare il time to live si chiama IP_MULTICAST_TTL e
lavora a livello ip IPPROTO_IP.
Questi valori sono delle costanti. Cercando in giro ho trovato che
IPPROTO_IP vale 0, mentre sul IP_MULTICAST_TTL ho trovato valori
discordanti, in alcuni casi vale 3 (winsock 1), in altri 10 (winsock2).
In questo caso wsock.dll dei nostri giorni in che modalità lavora
(considerando che la dll è tipo versione 4.9)?
Comunque ho provato sia con IP_MULTICAST_TTL a 3 che a 10, in fase di
lettura mi viene fuori il valore 1, in fase di scrittura mi prendo
l'errore 100022 che di solito viene fuori quando stò facendo una
richiesta errata provando a settare valori normali come 1,2,3 o 32.
Ho provato a settare altri parametri che non hanno a che fare con i
multicast e la funzione setsockopt funziona perfettamente.
Con Google ho trovato solo gente che ha avuto i miei stessi problemi,
anche 8 anni fà, ma nessuna risposta.
Qualcuno di voi ha mai avuto a che fare con problematiche simili?
Alternativamente potrei scrivere questa cosa in C, ma nessuno mi
assicura che non mi imbatta nelle stesse problematiche.
Grazie per l'attenzione
Gianni
-------------------------------------
Ecco il codice.
Option Explicit
Const SOCKET_ERROR = -1
Const IPPROTO_IP = 0
Const IP_MULTICAST_TTL = 10
Private 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 Long
Private 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 Long
Private Sub Command1_Click()
        Dim socket As Long
        socket = Winsock1.SocketHandle
        MsgBox "Multicast Options:" & vbCrLf & "IP_MULTICAST_TTL: " &
CStr(GetSocketOption(socket, IPPROTO_IP, IP_MULTICAST_TTL))
End Sub
Private Sub Command2_Click()
        Dim lResult As Long
        lResult = setsockopt(Winsock1.SocketHandle, IPPROTO_IP,
IP_MULTICAST_TTL, 32, 4)
        If (lResult = SOCKET_ERROR) Then
           MsgBox "Error setting IP_MULTICAST_TTL option: " &
CStr(Err.LastDllError)
        Else
           MsgBox "Option set"
        End If
End Sub
Public Function GetSocketOption(lSocket As Long, lLevel As Long, lOption
As Long) As Long
       Dim lResult As Long
       Dim lBuffer As Long
       Dim lBufferLen As Long
       lBufferLen = LenB(lBuffer)
       lResult = getsockopt(lSocket, lLevel, lOption, lBuffer,
lBufferLen)
       If (lResult = SOCKET_ERROR) Then
          GetSocketOption = Err.LastDllError
       Else
          GetSocketOption = lBuffer
       End If
End Function
Private Sub Form_Load()
        With Winsock1
             .Protocol = sckUDPProtocol
             .RemoteHost = "239.10.20.30"
             .RemotePort = 21000
             .Bind 8377
        End With
End Sub
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:d245d9c9fcf0a41c3dc...@mygate.mailgate.org...


 
http://www.ncat.co.uk/Net_Lib/microsoft/tcp-ip_reg.htm
Sul registro puoi variare solo il TTL del tcp-ip che normalmente è 32 e
quindi sta messo già di suo abbastanza bene.
Quello dei multicast di default stà a 1... :-(
Gianni
