Nodejs: socks5-https-client - повторите попытку с другим хостом при сбое соединения - PullRequest
0 голосов
/ 02 марта 2019

Я долго искал подобный ответ и не нашел.

Я использую этот код, и он работает довольно хорошо, но только при первом успешном соединении.Однако моя цель - повторить попытку с теми же учетными данными, но с другим хостом и портом.(Я использую несколько шлюзов socks5, и иногда они не реагируют, поэтому мне нужно попробовать другой)

Я пытаюсь вызвать одну и ту же функцию и всегда получаю сообщение об ошибке:

Ошибка: подключить ETIMEDOUT xxx.xxx.xxx.xxx:1081
к TCPConnectWrap.afterConnect [as oncomplete] (net.js: 1082: 14)
ошибка: «ETIMEDOUT»,
код: «ETIMEDOUT»,
syscall: 'connect',
адрес: 'xxx.xxx.xxx.xxx',
порт: 1081}

Похоже, предыдущее соединение не полностью отключено,

Вот фрагмент кода, который я использую для соединения и отправки.

var Agent = require('socks5-https-client/lib/Agent');
var request = require('request');

var fails = 0;
var max_fails = 2;

function get_data_via_socks5(client_host,url_to_check, datas, respon) {
	
	///passing array with connection details and backup socks5 hosts
	var api_key = datas.api_key
	var gate = datas.gate

	if(fails==0) {
	var host = datas.host
	var login  = datas.login
	var pass = datas.pass
	var port = datas.port
	
	}
	if(fails==1) {
		
	var host = datas.host2
	var login  = datas.login2
	var pass = datas.pass2
	var port = datas.port2
	
	}
	if(fails==2) {
	var host = datas.host3
	var login  = datas.login3
	var pass = datas.pass3
	var port = datas.port3
	
	}
	

			var jdata = '{somedata:somedata}';


			console.log("Trying to connect by:" , host, " on port: " , port, login, pass  );
			
					var con = request({
								method: 'POST',             
								url: gate, 
								body: jdata,
								headers: {               
								'Authorization': 'Basic ' + Buffer.from("apikey:"+api_key).toString('base64'),
										},
							strictSSL: true,
							agentClass: Agent,
							agentOptions: {
								keepAlive: false,
								socksHost: host, 
								socksPort: port, // Defaults to 1080.

								// Optional credentials
								socksUsername: login,
								sockspassword: pass,
							}
						}, function(err, res) {

									if( err ) {
											
											fails = fails+1
											if(fails<=max_fails) {
												
												console.log( 'Failed to get data using: ', host, "Attempt: ",fails, "ERROR:", err);
												//con.close()
													get_data_via_vpn(client_host,url_to_check,respon);
													return 
												
												
											} else {
											
												
												return console.log( 'Giving up to get data using: ', host, "Failed: ", fails ," attempts");
											
											
											}
									}
									
							if(!err) {		
							var response = JSON.parse( res.body);
							
								console.log(response);
								
								return respon(response);
							}
						});
						
		
	
}

Любая помощь будет очень признательна, я действительно застрял с этим.

...