svnno****@sourc*****
svnno****@sourc*****
2011年 2月 28日 (月) 17:12:35 JST
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; }