Socks5 への IP バインドに問題があります。私はいくつかのIPアドレスを持っています。
着信接続はすべてデフォルトの IP にバインドされていました。デフォルトIPなしでIPをバインドするにはどうすればよいですか?
体は私を助けてくれますか?ありがとう
これが私のコードの一部です。
Console.WriteLine("new client connected: " + socksClient.Client.RemoteEndPoint.ToString());
NetworkStream socksClientStream = socksClient.GetStream();
/* *****************************************************
* supported methods part
* ***************************************************** */
byte[] authFields = new byte[2];
socksClientStream.Read(authFields, 0, 2);
Console.WriteLine(string.Format("authFields: version {0} methods {1}", authFields[0], authFields[1]));
// read n supported methods
byte[] methods = new byte[authFields[1]];
socksClientStream.Read(methods, 0, methods.Length);
Console.WriteLine("socks client supports " + methods.Length.ToString() + " methods");
/* *****************************************************
* method selection part
* ***************************************************** */
byte[] selectedAuthMethod = { SOCKS_VERSION, SOCKS_NOAUTH };
socksClientStream.Write(selectedAuthMethod, 0, 2);
// return version and auth method "no auth"
byte[] requestFields = new byte[4];
socksClientStream.Read(requestFields, 0, 4);
Console.WriteLine("socksclient requests address type " + requestFields[3].ToString());
// adresstypes ipv4 and hostname are supported
string connection_target = "";
int target_port;
if (requestFields[3] == SOCKS_IPV4ADDR )
{
//ip4v adress is requested
byte[] target_data = new byte[4];
socksClientStream.Read(target_data, 0, 4);
IPAddress ip = new IPAddress(target_data);
connection_target = ip.ToString();
}
else if (requestFields[3] == SOCKS_DNSNAME )
{
//domainname requested
//doc: byteorder
byte[] domainname_length = new byte[1];
// read the following domain name length
socksClientStream.Read(domainname_length, 0, 1);
byte[] target_data = new byte[domainname_length[0]];
// read a domain name of requseted length
socksClientStream.Read(target_data, 0, domainname_length[0]);
//interpret the domainname in default encoding
connection_target = Encoding.Default.GetString(target_data);
}
else
{
//unsupported addresstype
Console.WriteLine("unsupported addresstype " + requestFields[3].ToString());
}
//if requested address is supported
if (connection_target != "")
{
/* *****************************************************
* server client connection part
* ***************************************************** */
//doc: byteorder
byte[] bintargetport = new byte[2];
socksClientStream.Read(bintargetport, 0, 2);
byte[] tmp_byteorder = new byte[2];
tmp_byteorder[0] = bintargetport[1];
tmp_byteorder[1] = bintargetport[0];
target_port = (int)BitConverter.ToUInt16(tmp_byteorder, 0);
Console.WriteLine("requesting " + connection_target + ":" + target_port.ToString());
serverClient = new TcpClient(connection_target, target_port);
/* *****************************************************
* reply part
* ***************************************************** */
if (serverClient.Connected)
{
// reply successful audience
byte[] reply = new byte[10];
//version
reply[0] = SOCKS_VERSION ;
// replycode
reply[1] = SOCKS_REPLYSUCCESS ;
//reserved and 0
reply[2] = 0;
// addresstype
reply[3] = 1;
string ip = serverClient.Client.LocalEndPoint.ToString().Split(':')[0];
IPAddress ipaddr = IPAddress.Parse(ip);
reply[4] = ipaddr.GetAddressBytes()[0];
reply[5] = ipaddr.GetAddressBytes()[1];
reply[6] = ipaddr.GetAddressBytes()[2];
reply[7] = ipaddr.GetAddressBytes()[3];
int port = int.Parse(serverClient.Client.LocalEndPoint.ToString().Split(':')[1]);
// read unsigned integer in networkoctet order
reply[8] = BitConverter.GetBytes((UInt16)port)[0];
reply[9] = BitConverter.GetBytes((UInt16)port)[1];
socksClientStream.Write(reply, 0, 10);
Console.WriteLine("writing reply");
/* *****************************************************
* tcp redirection
* ***************************************************** */
NetworkStream serverClientStream = serverClient.GetStream();
bool ioError = false;
// forward tcp data till one of the connected endpoints is disconnected
while (serverClient.Connected && socksClient.Connected && !ioError )
{
....
}