+ // IPv6対応\r
+// SetTaskMsg(MSGJPN027);\r
+ SetTaskMsg(MSGJPN027, MSGJPN333);\r
+\r
+ return(sSocket);\r
+}\r
+\r
+\r
+SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
+{\r
+ struct sockaddr_in6 SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+ struct sockaddr_in6 CurSockAddr; /* 接続先ホストのアドレス情報 */\r
+ struct sockaddr_in6 saSockAddr;\r
+ char HostEntry[MAXGETHOSTSTRUCT];\r
+ struct hostent *pHostEntry;\r
+ SOCKET sSocket;\r
+ int Len;\r
+ int Fwall;\r
+ SOCKS5REQUEST Socks5Cmd;\r
+ SOCKS5REPLY Socks5Reply;\r
+\r
+ //////////////////////////////\r
+ // ホスト名解決と接続の準備\r
+ //////////////////////////////\r
+\r
+ Fwall = FWALL_NONE;\r
+ if(AskHostFireWall() == YES)\r
+ Fwall = FwallType;\r
+\r
+ sSocket = INVALID_SOCKET;\r
+\r
+ UseIPadrs = YES;\r
+ strcpy(DomainName, host);\r
+ memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+ CurSockAddr.sin6_port = htons((u_short)port);\r
+ CurSockAddr.sin6_family = AF_INET6;\r
+ CurSockAddr.sin6_addr = inet6_addr(host);\r
+ if(memcmp(&CurSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+ {\r
+ // ホスト名が指定された\r
+ // ホスト名からアドレスを求める\r
+ if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) &&\r
+ (FwallResolv == YES))\r
+ {\r
+ // ホスト名解決はSOCKSサーバに任せる\r
+ pHostEntry = NULL;\r
+ }\r
+ else\r
+ {\r
+ // アドレスを取得\r
+ SetTaskMsg(MSGJPN016, DomainName, MSGJPN334);\r
+ pHostEntry = do_gethostbynameIPv6(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
+ }\r
+\r
+ if(pHostEntry != NULL)\r
+ {\r
+ memcpy((char *)&CurSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+ SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+ }\r
+ else\r
+ {\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ UseIPadrs = NO;\r
+ SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+ }\r
+ else\r
+ {\r
+ SetTaskMsg(MSGJPN019, host, MSGJPN334);\r
+ return(INVALID_SOCKET);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ // SOCKSを使う\r
+ // SOCKSに接続する準備\r
+ {\r
+ Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
+ }\r
+\r
+ memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+ SocksSockAddr.sin6_addr = inet6_addr(FwallHost);\r
+ if(memcmp(&SocksSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+ {\r
+ if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
+ memcpy((char *)&SocksSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+ else\r
+ {\r
+ SetTaskMsg(MSGJPN021, FwallHost, MSGJPN334);\r
+ return INVALID_SOCKET;\r
+ }\r
+ }\r
+ SocksSockAddr.sin6_port = htons((u_short)FwallPort);\r
+ SocksSockAddr.sin6_family = AF_INET6;\r
+ SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddr.sin6_addr), ntohs(SocksSockAddr.sin6_port), MSGJPN334);\r
+ // connectで接続する先はSOCKSサーバ\r
+ memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
+ }\r
+ else\r
+ {\r
+ // connectで接続するのは接続先のホスト\r
+ memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
+ }\r
+\r
+ /////////////\r
+ // 接続実行\r
+ /////////////\r
+\r
+ if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
+ {\r
+ // ソケットにデータを付与\r
+ SetAsyncTableDataIPv6(sSocket, &CurSockAddr, &SocksSockAddr);\r
+ if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
+ {\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL)\r
+ {\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+\r
+ Socks5Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || \r
+// (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+ (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
+ (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ {\r
+ SetTaskMsg(MSGJPN024, Socks5Reply.Result, MSGJPN334);\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+\r
+ }\r
+\r
+ if(sSocket != INVALID_SOCKET)\r
+ SetTaskMsg(MSGJPN025, MSGJPN334);\r
+ }\r
+ else\r
+ {\r
+//#pragma aaa\r
+ SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/, MSGJPN334);\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+ }\r
+ else\r
+ SetTaskMsg(MSGJPN027, MSGJPN334);\r