[Ttssh2-commit] [4350] 以下の条件を満たしている時に、接続後すぐに切断されるのを修正した。
svnnotify @ sourceforge.jp
svnnotify @ sourceforge.jp
Revision: 4350
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4350
Author: doda
Date: 2011-02-28 17:12:35 +0900 (Mon, 28 Feb 2011)
Log Message:
-----------
以下の条件を満たしている時に、接続後すぐに切断されるのを修正した。
・ローカル PC で IPv6 を有効にしている
・プロキシサーバが IPv6 アドレスを持たない
・プロトコルに UNSPEC を指定
# プロトコルが UNSPEC の時にプロキシの名前解決を 2 度行ってしまうが、とりあえず妥協。(キャッシュに期待)
# 変更箇所が大きくなりそうなので、4.69 が出てから対処を考えます。
Modified Paths:
--------------
trunk/TTProxy/ProxyWSockHook.h
-------------- next part --------------
Modified: trunk/TTProxy/ProxyWSockHook.h
===================================================================
--- trunk/TTProxy/ProxyWSockHook.h 2011-02-28 07:22:11 UTC (rev 4349)
+++ trunk/TTProxy/ProxyWSockHook.h 2011-02-28 08:12:35 UTC (rev 4350)
@@ -487,7 +487,10 @@
fillBuffer(buffer, bufferLength, "ssh", AF_UNSPEC);
}
void fillBuffer(char* buffer, int bufferLength, const char *portname, int addr_family) {
- struct servent *sv;
+ struct servent* sv;
+ struct addrinfo* res;
+ struct addrinfo* res0;
+ struct addrinfo hints;
int portnum = 0;
if (sv = getservbyname(portname, "tcp")) {
portnum = sv->s_port;
@@ -545,8 +548,41 @@
break;
case AF_UNSPEC:
default:
- dst->ainfo[0].ai_next = &dst->ainfo[1];
- dst->ai = &dst->ainfo[0];
+ memset(&hints, 0, sizeof hints);
+ getaddrinfo(proxy.host, NULL, &hints, &res0);
+ if (res0) {
+ int flag = 0;
+ for (res = res0; res; res = res->ai_next) {
+ switch (res->ai_family) {
+ case AF_INET6:
+ flag |= 1;
+ break;
+ case AF_INET:
+ flag |= 2;
+ break;
+ }
+ if (flag == 3)
+ break;
+ }
+ switch (flag) {
+ case 1:
+ dst->ai = &dst->ainfo[0];
+ break;
+ case 2:
+ dst->ai = &dst->ainfo[1];
+ break;
+ case 3:
+ default:
+ dst->ainfo[0].ai_next = &dst->ainfo[1];
+ dst->ai = &dst->ainfo[0];
+ break;
+ }
+ freeaddrinfo(res0);
+ }
+ else {
+ dst->ainfo[0].ai_next = &dst->ainfo[1];
+ dst->ai = &dst->ainfo[0];
+ }
break;
}
Ttssh2-commit メーリングリストの案内 |