|
-
Jul 10th, 2012, 08:32 AM
#1
Thread Starter
New Member
UPnP port mapping problem
Hello, new to VBForums. I am trying to automate the mapping of ports as part of the setting up of a server program intended for PC usage. I am familiar with networking theory but just getting my feet wet with implementations. I stumbled upon this C# routine -> http://bytes.com/topic/c-sharp/answe...s-nat-firewall and have translated it to VB to my best ability.
Code:
Sub setPF()
Dim nics() As System.Net.NetworkInformation.NetworkInterface = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
'For Each nic As System.Net.NetworkInformation.NetworkInterface In nics
Dim nic As System.Net.NetworkInformation.NetworkInterface = nics(2)
Dim machineIP As String = nic.GetIPProperties().UnicastAddresses(0).Address.ToString()
For Each gwInfo As System.Net.NetworkInformation.GatewayIPAddressInformation In nic.GetIPProperties.GatewayAddresses
openFireWallPort(machineIP, gwInfo.Address.ToString(), 40)
Next
'Next
End Sub
Sub openFireWallPort(ByVal machineIP As String, ByVal firewallIP As String, ByVal openPort As Integer)
Dim svc As String = getServicesFromDevice(firewallIP)
openPortFromService(svc, "urn:schemas-upnp-org:service:WANIPConnection:1", machineIP, firewallIP, 80, openPort)
openPortFromService(svc, "urn:schemas-upnp-org:service:WANPPPConnection:1", machineIP, firewallIP, 80, openPort)
End Sub
Function getServicesFromDevice(ByVal firewallIP As String)
Dim queryResponse As String = ""
Dim query As String = "M-SEARCH * HTTP/1.1" & vbCrLf & "Host:" & firewallIP & ":1900" & vbCrLf & "ST:upnp:rootdevice" & vbCrLf & _
"Man:""ssdp:discover""" & vbCrLf & "MX:3" & vbCrLf & vbCrLf & vbCrLf
Dim client As System.Net.Sockets.Socket = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp)
Dim endPoint As System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Parse(firewallIP), 1900)
client.SetSocketOption(Net.Sockets.SocketOptionLevel.Socket, Net.Sockets.SocketOptionName.ReceiveTimeout, 1500)
Dim q As Byte() = System.Text.Encoding.ASCII.GetBytes(query)
client.SendTo(q, q.Length, Net.Sockets.SocketFlags.None, endPoint)
Dim sender As System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Dim senderEP As System.Net.EndPoint = CType(sender, System.Net.EndPoint)
Dim data As Byte() = New Byte(1024) {}
Dim recv As Integer = client.ReceiveFrom(data, senderEP)
queryResponse = System.Text.Encoding.ASCII.GetString(data)
If queryResponse.Length = 0 Then Return ""
' QueryResult is somthing like this:
'HTTP/1.1 200 OK
'Cache-Control:max-age=60
'Location:http://10.10.10.1:80/upnp/service/des_ppp.xml
'Server:NT/5.0 UPnP/1.0
'ST:upnp:rootdevice
'EXT:
'USN:uuid:upnp-InternetGatewayDevice-1_0-00095bd945a2::upnp:rootdevice
Dim location As String = ""
Dim parts() As String = queryResponse.Split(New String() {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
For Each part As String In parts
If part.ToLower().StartsWith("location") Then
location = part.Substring(part.IndexOf(":") + 1)
Exit For
End If
Next
If location.Length() = 0 Then Return ""
Dim webClient As System.Net.WebClient = New System.Net.WebClient()
Dim ret As String = webClient.DownloadString(location)
MsgBox("webClient String: " & ret)
Return ret
End Function
Sub openPortFromService(ByVal services As String, ByVal serviceType As String, _
ByVal machineIP As String, ByVal firewallIP As String, _
ByVal gatewayPort As Integer, ByVal portToForward As Integer)
If services.Length = 0 Then Exit Sub
Dim svcIndex As Integer = services.IndexOf(serviceType)
If svcIndex = -1 Then Exit Sub
Dim controlUrl As String = services.Substring(svcIndex)
Dim tag1 As String = "<controlURL>"
Dim tag2 As String = "</controlURL>"
controlUrl = controlUrl.Substring(controlUrl.IndexOf(tag1) + tag1.Length)
controlUrl = controlUrl.Substring(0, controlUrl.IndexOf(tag2))
Dim soapBody As String = "<s:Envelope " & "xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"" " & _
"s:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/ "">" & "<s:Body>" & _
"<u:AddPortMapping xmlns:u=""" + serviceType + """>" & "<NewRemoteHost></NewRemoteHost>" & _
"<NewExternalPort>" & portToForward.ToString() & "</NewExternalPort>" & _
"<NewProtocol>TCP</NewProtocol>" & "<NewInternalPort>" + portToForward.ToString() & _
"</NewInternalPort>" & "<NewInternalClient>" & machineIP & "</NewInternalClient>" & _
"<NewEnabled>1</NewEnabled>" & "<NewPortMappingDescription>Woodchop Client</NewPortMappingDescription>" &
"<NewLeaseDuration>0</NewLeaseDuration>" & "</u:AddPortMapping>" & "</s:Body>" & "</s:Envelope>"
Dim body() As Byte = System.Text.UTF8Encoding.ASCII.GetBytes(soapBody)
Dim url As String = "http://" & firewallIP & ":" & gatewayPort.ToString() & controlUrl
Dim wr As System.Net.WebRequest = System.Net.WebRequest.Create(url)
wr.Method = "POST"
Dim header As String = Chr(34) & serviceType & "#AddPortMapping"""
wr.Headers.Add("SOAPAction", header)
wr.ContentType = "text/xml;charset=""utf-8"""
wr.ContentLength = body.Length
Dim stream As System.IO.Stream = wr.GetRequestStream()
stream.Write(body, 0, body.Length)
stream.Flush()
stream.Close()
Dim wres As System.Net.WebResponse = wr.GetResponse()
Dim sr As System.IO.StreamReader = New System.IO.StreamReader(wres.GetResponseStream())
Dim ret As String = sr.ReadToEnd()
sr.Close()
MsgBox("Setting port forwarding:" & portToForward.ToString() & vbcrlf & vbcrlf & ret)
This code runs fine until the end when the SOAP message with the port mapping details is sent. Here my router is returning a 404 error after i send it the message. I have tried two routers of different manufacturers and i'm getting the same response. Any help would be greatly appreciated.
-
Jul 11th, 2012, 10:50 AM
#2
Re: UPnP port mapping problem
Have you tried the techniques described in Easy UPnP NAT Traversal yet?
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|