471,593 Members | 1,771 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,593 software developers and data experts.

promiscuous sockets

Is there any way to use a C# socket in promiscuous mode?
Any sample code that shows how this is done?

any assistance is much appreciated!
thanks
LK
Nov 16 '05 #1
6 6514
Isn't that illegal?

I know the linux platform lets you hack into the TCP/IP stack when using C++
to do this, but I would be very surprised if Microsoft didn't seal that door
shut in its Windows TCP/IP stack.

Then again, I do not know, so this is a non-answer.

Jon
"Laxmikant Rashinkar" <LK@televital.com> wrote in message
news:ek**************@TK2MSFTNGP12.phx.gbl...
Is there any way to use a C# socket in promiscuous mode?
Any sample code that shows how this is done?

any assistance is much appreciated!
thanks
LK

Nov 16 '05 #2
Are you referring to UDP? Uh, please ignore previous post!! I was thinking of something else (i.e. having sex with someone else's TCP socket).

Take a look at the UdpClient Class.

Jon

---
.NET Framework Class Library

UdpClient Class
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP | UdpClient Members (Visual J# Syntax) | Managed Extensions for C++ Programming

Requirements
Namespace: System.Net.Sockets

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family, .NET Compact Framework

Assembly: System (in System.dll)

..NET Framework Security:

a.. SocketPermission To establish an outgoing connection or accept an incoming request.
Language
a.. C#

b.. C++

c.. JScript

d.. Visual Basic

e.. Show All
Provides User Datagram Protocol (UDP) network services.

For a list of all members of this type, see UdpClient Members.

System.Object
System.Net.Sockets.UdpClient

[Visual Basic]
Public Class UdpClient
Implements IDisposable
[C#]
public class UdpClient : IDisposable
[C++]
public __gc class UdpClient : public IDisposable
[JScript]
public class UdpClient implements IDisposable
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Remarks
The UdpClient class provides simple methods for sending and receiving connectionless UDP datagrams in blocking synchronous mode. Because UDP is a connectionless transport protocol, you do not need to establish a remote host connection prior to sending and receiving data. You do, however, have the option of establishing a default remote host in one of the following two ways:

a.. Create an instance of the UdpClient class using the remote host name and port number as parameters.
b.. Create an instance of the UdpClient class and then call the Connect method.
You can use any of the send methods provided in the UdpClient to send data to a remote device. Use the Receive method to receive data from remote hosts.

Note Do not call Send using a host name or IPEndPoint if you have already specified a default remote host. If you do, UdpClient will throw an exception.
UdpClient methods also allow you to send and receive multicasted datagrams. Use The JoinMulticastGroup method to subscribe a UdpClient to a multicast group. Use the DropMulticastGroup method to unsubscribe a UdpClient from a multicast group.

Example
[Visual Basic, C#, C++] The following example establishes a UdpClient connection using the host name www.contoso.com on port 11000. A small string message is sent to two separate remote host machines. The Receive method blocks execution until a message is received. Using the IPEndPoint passed to Receive, the identity of the responding host is revealed.

[Visual Basic]
' This constructor arbitrarily assigns the local port number.
Dim udpClient As New UdpClient()
Try
udpClient.Connect("www.contoso.com", 11000)

' Sends a message to the host to which you have connected.
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there?")

udpClient.Send(sendBytes, sendBytes.Length)

' Sends message to a different host using optional hostname and port parameters.
Dim udpClientB As New UdpClient()
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000)

'Blocks until a message returns on this socket from a remote host.
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)

' Blocks until a message returns on this socket from a remote host.
Dim receiveBytes As [Byte]() = udpClient.Receive(RemoteIpEndPoint)
Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)

' Which one of these two hosts responded?
Console.WriteLine(("This is the message you received " + _
returnData.ToString()))
Console.WriteLine(("This message was sent from " + _
RemoteIpEndPoint.Address.ToString() + _
" on their port number " + _
RemoteIpEndPoint.Port.ToString()))
udpClient.Close()
udpClientB.Close()

Catch e As Exception
Console.WriteLine(e.ToString())
End Try
End Sub
[C#]
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient();
try{
udpClient.Connect("www.contoso.com", 11000);

// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

udpClient.Send(sendBytes, sendBytes.Length);

// Sends a message to a different host using optional hostname and port parameters.
UdpClient udpClientB = new UdpClient();
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);

// Uses the IPEndPoint object to determine which of these two hosts responded.
Console.WriteLine("This is the message you received " +
returnData.ToString());
Console.WriteLine("This message was sent from " +
RemoteIpEndPoint.Address.ToString() +
" on their port number " +
RemoteIpEndPoint.Port.ToString());

udpClient.Close();
udpClientB.Close();

}
catch (Exception e ) {
Console.WriteLine(e.ToString());
}
[C++]
// With this constructor the local port number is arbitrarily assigned.
UdpClient __gc *udpClient = new UdpClient();
try {
udpClient->Connect(S"host.contoso.com", 11000);

// Send message to the host to which you have connected.
Byte sendBytes __gc[] = Encoding::ASCII->GetBytes(S"Is anybody there?");

udpClient->Send(sendBytes, sendBytes->Length);

// Send message to a different host using optional hostname and port parameters.
UdpClient __gc *udpClientB = new UdpClient();
udpClientB->Send(sendBytes, sendBytes->Length, S"AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any source.
IPEndPoint __gc *RemoteIpEndPoint = new IPEndPoint(IPAddress::Any, 0);

// Block until a message returns on this socket from a remote host.
Byte receiveBytes __gc[] = udpClient->Receive(&RemoteIpEndPoint);
String __gc *returnData = Encoding::ASCII->GetString(receiveBytes);

// Use the IPEndPoint object to determine which of these two hosts responded.
Console::WriteLine(String::Concat(S"This is the message you received ", returnData->ToString()));
Console::WriteLine(String::Concat(S"This message was sent from ", RemoteIpEndPoint->Address->ToString(),
S" on their port number ", __box(RemoteIpEndPoint->Port)->ToString()));

udpClient->Close();
udpClientB->Close();

}
catch (Exception __gc *e ) {
Console::WriteLine(e->ToString());
}
[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button in the upper-left corner of the page.

Requirements
Namespace: System.Net.Sockets

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family, .NET Compact Framework

Assembly: System (in System.dll)

..NET Framework Security:

a.. SocketPermission To establish an outgoing connection or accept an incoming request.
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP | UdpClient Members (Visual J# Syntax) | Managed Extensions for C++ Programming
Syntax based on .NET Framework version 1.1.
Documentation version 1.1.1.

"Jon Davis" <jo*@REMOVE.ME.jondavis.net> wrote in message news:OF**************@TK2MSFTNGP11.phx.gbl...
Isn't that illegal?

I know the linux platform lets you hack into the TCP/IP stack when using C++
to do this, but I would be very surprised if Microsoft didn't seal that door
shut in its Windows TCP/IP stack.

Then again, I do not know, so this is a non-answer.

Jon


"Laxmikant Rashinkar" <LK@televital.com> wrote in message
news:ek**************@TK2MSFTNGP12.phx.gbl...
Is there any way to use a C# socket in promiscuous mode?
Any sample code that shows how this is done?

any assistance is much appreciated!
thanks
LK


Nov 16 '05 #3
Are you referring to UDP? Uh, please ignore previous post!! I was thinking
of something else (i.e. having sex with someone else's TCP socket).

Take a look at the UdpClient Class.

Jon

..NET Framework Class Library

UdpClient Class
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP |
UdpClient Members (Visual J# Syntax) | Managed Extensions for C++
Programming
Requirements
Namespace: System.Net.Sockets
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows
2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003
family, .NET Compact Framework
Assembly: System (in System.dll)
..NET Framework Security:
SocketPermission To establish an outgoing connection or accept an incoming
request.
Language
C#

C++

JScript

Visual Basic

Show All
Provides User Datagram Protocol (UDP) network services.
For a list of all members of this type, see UdpClient Members.
System.Object
System.Net.Sockets.UdpClient
[Visual Basic]
Public Class UdpClient
Implements IDisposable
[C#]
public class UdpClient : IDisposable
[C++]
public __gc class UdpClient : public IDisposable
[JScript]
public class UdpClient implements IDisposable
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread
safe. Any instance members are not guaranteed to be thread safe.
Remarks
The UdpClient class provides simple methods for sending and receiving
connectionless UDP datagrams in blocking synchronous mode. Because UDP is a
connectionless transport protocol, you do not need to establish a remote
host connection prior to sending and receiving data. You do, however, have
the option of establishing a default remote host in one of the following two
ways:
Create an instance of the UdpClient class using the remote host name and
port number as parameters.
Create an instance of the UdpClient class and then call the Connect method.
You can use any of the send methods provided in the UdpClient to send data
to a remote device. Use the Receive method to receive data from remote
hosts.
Note Do not call Send using a host name or IPEndPoint if you have already
specified a default remote host. If you do, UdpClient will throw an
exception.
UdpClient methods also allow you to send and receive multicasted datagrams.
Use The JoinMulticastGroup method to subscribe a UdpClient to a multicast
group. Use the DropMulticastGroup method to unsubscribe a UdpClient from a
multicast group.
Example
[Visual Basic, C#, C++] The following example establishes a UdpClient
connection using the host name www.contoso.com on port 11000. A small string
message is sent to two separate remote host machines. The Receive method
blocks execution until a message is received. Using the IPEndPoint passed to
Receive, the identity of the responding host is revealed.
[Visual Basic]
' This constructor arbitrarily assigns the local port number.
Dim udpClient As New UdpClient()
Try
udpClient.Connect("www.contoso.com", 11000)

' Sends a message to the host to which you have connected.
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there?")

udpClient.Send(sendBytes, sendBytes.Length)

' Sends message to a different host using optional hostname and port
parameters.
Dim udpClientB As New UdpClient()
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName",
11000)

'Blocks until a message returns on this socket from a remote host.
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)

' Blocks until a message returns on this socket from a remote host.
Dim receiveBytes As [Byte]() = udpClient.Receive(RemoteIpEndPoint)
Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)

' Which one of these two hosts responded?
Console.WriteLine(("This is the message you received " + _
returnData.ToString()))
Console.WriteLine(("This message was sent from " + _
RemoteIpEndPoint.Address.ToString() + _
" on their port number " + _
RemoteIpEndPoint.Port.ToString()))
udpClient.Close()
udpClientB.Close()

Catch e As Exception
Console.WriteLine(e.ToString())
End Try
End Sub
[C#]
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient();
try{
udpClient.Connect("www.contoso.com", 11000);

// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

udpClient.Send(sendBytes, sendBytes.Length);

// Sends a message to a different host using optional hostname and
port parameters.
UdpClient udpClientB = new UdpClient();
udpClientB.Send(sendBytes, sendBytes.Length,
"AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any
source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

// Blocks until a message returns on this socket from a remote
host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);

// Uses the IPEndPoint object to determine which of these two hosts
responded.
Console.WriteLine("This is the message you received " +
returnData.ToString());
Console.WriteLine("This message was sent from " +
RemoteIpEndPoint.Address.ToString() +
" on their port number " +
RemoteIpEndPoint.Port.ToString());

udpClient.Close();
udpClientB.Close();

}
catch (Exception e ) {
Console.WriteLine(e.ToString());
}
[C++]
// With this constructor the local port number is arbitrarily assigned.
UdpClient __gc *udpClient = new UdpClient();
try {
udpClient->Connect(S"host.contoso.com", 11000);

// Send message to the host to which you have connected.
Byte sendBytes __gc[] = Encoding::ASCII->GetBytes(S"Is anybody there?");

udpClient->Send(sendBytes, sendBytes->Length);

// Send message to a different host using optional hostname and port
parameters.
UdpClient __gc *udpClientB = new UdpClient();
udpClientB->Send(sendBytes, sendBytes->Length,
S"AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any
source.
IPEndPoint __gc *RemoteIpEndPoint = new IPEndPoint(IPAddress::Any, 0);

// Block until a message returns on this socket from a remote host.
Byte receiveBytes __gc[] = udpClient->Receive(&RemoteIpEndPoint);
String __gc *returnData = Encoding::ASCII->GetString(receiveBytes);

// Use the IPEndPoint object to determine which of these two hosts
responded.
Console::WriteLine(String::Concat(S"This is the message you received ",
returnData->ToString()));
Console::WriteLine(String::Concat(S"This message was sent from ",
RemoteIpEndPoint->Address->ToString(),
S" on their port number ",
__box(RemoteIpEndPoint->Port)->ToString()));

udpClient->Close();
udpClientB->Close();

}
catch (Exception __gc *e ) {
Console::WriteLine(e->ToString());
}
[JScript] No example is available for JScript. To view a Visual Basic, C#,
or C++ example, click the Language Filter button in the upper-left corner
of the page.
Requirements
Namespace: System.Net.Sockets
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows
2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003
family, .NET Compact Framework
Assembly: System (in System.dll)
..NET Framework Security:
SocketPermission To establish an outgoing connection or accept an incoming
request.
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP |
UdpClient Members (Visual J# Syntax) | Managed Extensions for C++
Programming
Syntax based on .NET Framework version 1.1.
Documentation version 1.1.1.
Nov 16 '05 #4
Are you referring to UDP? Uh, please ignore previous post!! I was thinking
of something else (i.e. doing the nasty with someone else's TCP socket).

Take a look at the UdpClient Class.

Jon

..NET Framework Class Library

UdpClient Class
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP |
UdpClient Members (Visual J# Syntax) | Managed Extensions for C++
Programming
Requirements
Namespace: System.Net.Sockets
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows
2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003
family, .NET Compact Framework
Assembly: System (in System.dll)
..NET Framework Security:
SocketPermission To establish an outgoing connection or accept an incoming
request.
Language
C#

C++

JScript

Visual Basic

Show All
Provides User Datagram Protocol (UDP) network services.
For a list of all members of this type, see UdpClient Members.
System.Object
System.Net.Sockets.UdpClient
[Visual Basic]
Public Class UdpClient
Implements IDisposable
[C#]
public class UdpClient : IDisposable
[C++]
public __gc class UdpClient : public IDisposable
[JScript]
public class UdpClient implements IDisposable
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread
safe. Any instance members are not guaranteed to be thread safe.
Remarks
The UdpClient class provides simple methods for sending and receiving
connectionless UDP datagrams in blocking synchronous mode. Because UDP is a
connectionless transport protocol, you do not need to establish a remote
host connection prior to sending and receiving data. You do, however, have
the option of establishing a default remote host in one of the following two
ways:
Create an instance of the UdpClient class using the remote host name and
port number as parameters.
Create an instance of the UdpClient class and then call the Connect method.
You can use any of the send methods provided in the UdpClient to send data
to a remote device. Use the Receive method to receive data from remote
hosts.
Note Do not call Send using a host name or IPEndPoint if you have already
specified a default remote host. If you do, UdpClient will throw an
exception.
UdpClient methods also allow you to send and receive multicasted datagrams.
Use The JoinMulticastGroup method to subscribe a UdpClient to a multicast
group. Use the DropMulticastGroup method to unsubscribe a UdpClient from a
multicast group.
Example
[Visual Basic, C#, C++] The following example establishes a UdpClient
connection using the host name www.contoso.com on port 11000. A small string
message is sent to two separate remote host machines. The Receive method
blocks execution until a message is received. Using the IPEndPoint passed to
Receive, the identity of the responding host is revealed.
[Visual Basic]
' This constructor arbitrarily assigns the local port number.
Dim udpClient As New UdpClient()
Try
udpClient.Connect("www.contoso.com", 11000)

' Sends a message to the host to which you have connected.
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there?")

udpClient.Send(sendBytes, sendBytes.Length)

' Sends message to a different host using optional hostname and port
parameters.
Dim udpClientB As New UdpClient()
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName",
11000)

'Blocks until a message returns on this socket from a remote host.
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)

' Blocks until a message returns on this socket from a remote host.
Dim receiveBytes As [Byte]() = udpClient.Receive(RemoteIpEndPoint)
Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)

' Which one of these two hosts responded?
Console.WriteLine(("This is the message you received " + _
returnData.ToString()))
Console.WriteLine(("This message was sent from " + _
RemoteIpEndPoint.Address.ToString() + _
" on their port number " + _
RemoteIpEndPoint.Port.ToString()))
udpClient.Close()
udpClientB.Close()

Catch e As Exception
Console.WriteLine(e.ToString())
End Try
End Sub
[C#]
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient();
try{
udpClient.Connect("www.contoso.com", 11000);

// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

udpClient.Send(sendBytes, sendBytes.Length);

// Sends a message to a different host using optional hostname and
port parameters.
UdpClient udpClientB = new UdpClient();
udpClientB.Send(sendBytes, sendBytes.Length,
"AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any
source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

// Blocks until a message returns on this socket from a remote
host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);

// Uses the IPEndPoint object to determine which of these two hosts
responded.
Console.WriteLine("This is the message you received " +
returnData.ToString());
Console.WriteLine("This message was sent from " +
RemoteIpEndPoint.Address.ToString() +
" on their port number " +
RemoteIpEndPoint.Port.ToString());

udpClient.Close();
udpClientB.Close();

}
catch (Exception e ) {
Console.WriteLine(e.ToString());
}
[C++]
// With this constructor the local port number is arbitrarily assigned.
UdpClient __gc *udpClient = new UdpClient();
try {
udpClient->Connect(S"host.contoso.com", 11000);

// Send message to the host to which you have connected.
Byte sendBytes __gc[] = Encoding::ASCII->GetBytes(S"Is anybody there?");

udpClient->Send(sendBytes, sendBytes->Length);

// Send message to a different host using optional hostname and port
parameters.
UdpClient __gc *udpClientB = new UdpClient();
udpClientB->Send(sendBytes, sendBytes->Length,
S"AlternateHostMachineName", 11000);

//IPEndPoint object will allow us to read datagrams sent from any
source.
IPEndPoint __gc *RemoteIpEndPoint = new IPEndPoint(IPAddress::Any, 0);

// Block until a message returns on this socket from a remote host.
Byte receiveBytes __gc[] = udpClient->Receive(&RemoteIpEndPoint);
String __gc *returnData = Encoding::ASCII->GetString(receiveBytes);

// Use the IPEndPoint object to determine which of these two hosts
responded.
Console::WriteLine(String::Concat(S"This is the message you received ",
returnData->ToString()));
Console::WriteLine(String::Concat(S"This message was sent from ",
RemoteIpEndPoint->Address->ToString(),
S" on their port number ",
__box(RemoteIpEndPoint->Port)->ToString()));

udpClient->Close();
udpClientB->Close();

}
catch (Exception __gc *e ) {
Console::WriteLine(e->ToString());
}
[JScript] No example is available for JScript. To view a Visual Basic, C#,
or C++ example, click the Language Filter button in the upper-left corner
of the page.
Requirements
Namespace: System.Net.Sockets
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows
2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003
family, .NET Compact Framework
Assembly: System (in System.dll)
..NET Framework Security:
SocketPermission To establish an outgoing connection or accept an incoming
request.
See Also
UdpClient Members | System.Net.Sockets Namespace | TcpClient | TCP/UDP |
UdpClient Members (Visual J# Syntax) | Managed Extensions for C++
Programming
Syntax based on .NET Framework version 1.1.
Documentation version 1.1.1.

Nov 16 '05 #5
"Laxmikant Rashinkar" <LK@televital.com> wrote in message
news:ek**************@TK2MSFTNGP12.phx.gbl...
Is there any way to use a C# socket in promiscuous mode?
Any sample code that shows how this is done?


I don't know what "promiscuous mode" is, but one can open a socket in "raw
mode" with C++.
Nov 16 '05 #6
"Laxmikant Rashinkar" <LK@televital.com> wrote in message
news:ek**************@TK2MSFTNGP12.phx.gbl...
Is there any way to use a C# socket in promiscuous mode?
Any sample code that shows how this is done?


I don't know what "promiscuous mode" is, but one can open a socket in "raw
mode" with C++.
Nov 16 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Tero Saarni | last post: by
1 post views Thread by Dmitry Akselrod | last post: by
reply views Thread by armsby | last post: by
3 posts views Thread by Michael Maercker | last post: by
reply views Thread by XIAOLAOHU | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.