FFFTPのソースコードです。
Revision | 27e47ec02a3553a6e9b4e935a43dc28919d91c0d (tree) |
---|---|
Zeit | 2011-11-12 00:40:56 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Add routines for IPv6.
Fix bugs of simultaneous connection.
Add support for reusing control connection.
@@ -1364,6 +1364,7 @@ BEGIN | ||
1364 | 1364 | EDITTEXT HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER |
1365 | 1365 | CONTROL "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14 |
1366 | 1366 | LTEXT "(1`4)",-1,102,10,31,8 |
1367 | + CONTROL "CEBhEÌ\PbgðÄp",HSET_REUSE_SOCKET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,27,131,10 | |
1367 | 1368 | END |
1368 | 1369 | |
1369 | 1370 |
@@ -430,6 +430,7 @@ | ||
430 | 430 | #define HSET_THREAD_COUNT 1204 |
431 | 431 | #define HSET_THREAD_COUNT_SPN 1205 |
432 | 432 | #define HSET_UTF8BOM_CNV 1206 |
433 | +#define HSET_REUSE_SOCKET 1207 | |
433 | 434 | #define MENU_END 40001 |
434 | 435 | #define MENU_EXIT 40001 |
435 | 436 | #define MENU_CONNECT 40003 |
@@ -616,7 +617,7 @@ | ||
616 | 617 | #ifndef APSTUDIO_READONLY_SYMBOLS |
617 | 618 | #define _APS_NEXT_RESOURCE_VALUE 191 |
618 | 619 | #define _APS_NEXT_COMMAND_VALUE 40176 |
619 | -#define _APS_NEXT_CONTROL_VALUE 1207 | |
620 | +#define _APS_NEXT_CONTROL_VALUE 1208 | |
620 | 621 | #define _APS_NEXT_SYMED_VALUE 101 |
621 | 622 | #endif |
622 | 623 | #endif |
@@ -1390,6 +1390,7 @@ BEGIN | ||
1390 | 1390 | EDITTEXT HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER |
1391 | 1391 | CONTROL "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14 |
1392 | 1392 | LTEXT "(1 to 4 threads)",-1,102,10,53,8 |
1393 | + CONTROL "Reuse socket of the main window",HSET_REUSE_SOCKET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,27,131,10 | |
1393 | 1394 | END |
1394 | 1395 | |
1395 | 1396 |
@@ -430,6 +430,7 @@ | ||
430 | 430 | #define HSET_THREAD_COUNT 1204 |
431 | 431 | #define HSET_THREAD_COUNT_SPN 1205 |
432 | 432 | #define HSET_UTF8BOM_CNV 1206 |
433 | +#define HSET_REUSE_SOCKET 1207 | |
433 | 434 | #define MENU_END 40001 |
434 | 435 | #define MENU_EXIT 40001 |
435 | 436 | #define MENU_CONNECT 40003 |
@@ -616,7 +617,7 @@ | ||
616 | 617 | #ifndef APSTUDIO_READONLY_SYMBOLS |
617 | 618 | #define _APS_NEXT_RESOURCE_VALUE 191 |
618 | 619 | #define _APS_NEXT_COMMAND_VALUE 40176 |
619 | -#define _APS_NEXT_CONTROL_VALUE 1207 | |
620 | +#define _APS_NEXT_CONTROL_VALUE 1208 | |
620 | 621 | #define _APS_NEXT_SYMED_VALUE 101 |
621 | 622 | #endif |
622 | 623 | #endif |
@@ -946,6 +946,7 @@ typedef struct { | ||
946 | 946 | char PrivateKey[PRIVATE_KEY_LEN+1]; /* テキスト形式の秘密鍵 */ |
947 | 947 | // 同時接続対応 |
948 | 948 | int MaxThreadCount; /* 同時接続数 */ |
949 | + int ReuseCmdSkt; /* メインウィンドウのソケットを再利用する (YES/NO) */ | |
949 | 950 | // FEAT対応 |
950 | 951 | int Feature; /* 利用可能な機能のフラグ (FEATURE_xxx) */ |
951 | 952 | // MLSD対応 |
@@ -1006,6 +1007,7 @@ typedef struct historydata { | ||
1006 | 1007 | char PrivateKey[PRIVATE_KEY_LEN+1]; /* テキスト形式の秘密鍵 */ |
1007 | 1008 | // 同時接続対応 |
1008 | 1009 | int MaxThreadCount; /* 同時接続数 */ |
1010 | + int ReuseCmdSkt; /* メインウィンドウのソケットを再利用する (YES/NO) */ | |
1009 | 1011 | // MLSD対応 |
1010 | 1012 | int UseMLSD; /* "MLSD"コマンドを使用する */ |
1011 | 1013 | // IPv6対応 |
@@ -1428,6 +1430,7 @@ int AskUseSFTP(void); | ||
1428 | 1430 | char *AskPrivateKey(void); |
1429 | 1431 | // 同時接続対応 |
1430 | 1432 | int AskMaxThreadCount(void); |
1433 | +int AskReuseCmdSkt(void); | |
1431 | 1434 | // FEAT対応 |
1432 | 1435 | int AskHostFeature(void); |
1433 | 1436 | // MLSD対応 |
@@ -990,9 +990,7 @@ int ReConnectCmdSkt(void) | ||
990 | 990 | int Sts; |
991 | 991 | |
992 | 992 | |
993 | - // 同時接続対応 | |
994 | -// if(CmdCtrlSocket != TrnCtrlSocket) | |
995 | - if(CmdCtrlSocket != TrnCtrlSocket && TrnCtrlSocket != INVALID_SOCKET) | |
993 | + if(CmdCtrlSocket != TrnCtrlSocket) | |
996 | 994 | do_closesocket(TrnCtrlSocket); |
997 | 995 | TrnCtrlSocket = INVALID_SOCKET; |
998 | 996 |
@@ -1150,10 +1148,13 @@ void SktShareProh(void) | ||
1150 | 1148 | //SetTaskMsg("############### SktShareProh"); |
1151 | 1149 | |
1152 | 1150 | // 同時接続対応 |
1153 | - // 転送スレッドがソケットを各自で用意 | |
1154 | - // TrnCtrlSocketはメインスレッド以外から使用されない | |
1155 | 1151 | // CmdCtrlSocket = INVALID_SOCKET; |
1156 | 1152 | // ReConnectSkt(&CmdCtrlSocket); |
1153 | + if(CurHost.ReuseCmdSkt == YES) | |
1154 | + { | |
1155 | + CmdCtrlSocket = INVALID_SOCKET; | |
1156 | + ReConnectSkt(&CmdCtrlSocket); | |
1157 | + } | |
1157 | 1158 | } |
1158 | 1159 | return; |
1159 | 1160 | } |
@@ -1174,8 +1175,10 @@ int AskShareProh(void) | ||
1174 | 1175 | int Sts; |
1175 | 1176 | |
1176 | 1177 | Sts = YES; |
1178 | + // 同時接続対応 | |
1177 | 1179 | // if(CmdCtrlSocket == TrnCtrlSocket) |
1178 | -// Sts = NO; | |
1180 | + if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET) | |
1181 | + Sts = NO; | |
1179 | 1182 | |
1180 | 1183 | return(Sts); |
1181 | 1184 | } |
@@ -2475,6 +2478,11 @@ int AskMaxThreadCount(void) | ||
2475 | 2478 | return(CurHost.MaxThreadCount); |
2476 | 2479 | } |
2477 | 2480 | |
2481 | +int AskReuseCmdSkt(void) | |
2482 | +{ | |
2483 | + return(CurHost.ReuseCmdSkt); | |
2484 | +} | |
2485 | + | |
2478 | 2486 | // FEAT対応 |
2479 | 2487 | int AskHostFeature(void) |
2480 | 2488 | { |
@@ -129,9 +129,6 @@ void DownLoadProc(int ChName, int ForceFile, int All) | ||
129 | 129 | { |
130 | 130 | DisableUserOpe(); |
131 | 131 | |
132 | - // 同時接続対応 | |
133 | - SktShareProh(); | |
134 | - | |
135 | 132 | ExistNotify = YES; |
136 | 133 | // KeepTransferDialog(YES); |
137 | 134 |
@@ -263,9 +260,6 @@ void DirectDownLoadProc(char *Fname) | ||
263 | 260 | { |
264 | 261 | DisableUserOpe(); |
265 | 262 | |
266 | - // 同時接続対応 | |
267 | - SktShareProh(); | |
268 | - | |
269 | 263 | ExistNotify = YES; |
270 | 264 | // KeepTransferDialog(YES); |
271 | 265 |
@@ -405,9 +399,6 @@ void MirrorDownloadProc(int Notify) | ||
405 | 399 | { |
406 | 400 | DisableUserOpe(); |
407 | 401 | |
408 | - // 同時接続対応 | |
409 | - SktShareProh(); | |
410 | - | |
411 | 402 | Base = NULL; |
412 | 403 | |
413 | 404 | if(Notify == YES) |
@@ -879,9 +870,6 @@ void UpLoadListProc(int ChName, int All) | ||
879 | 870 | { |
880 | 871 | DisableUserOpe(); |
881 | 872 | |
882 | - // 同時接続対応 | |
883 | - SktShareProh(); | |
884 | - | |
885 | 873 | // ローカル側で選ばれているファイルをFileListBaseに登録 |
886 | 874 | FileListBase = NULL; |
887 | 875 | MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg); |
@@ -1050,9 +1038,6 @@ void UpLoadDragProc(WPARAM wParam) | ||
1050 | 1038 | { |
1051 | 1039 | DisableUserOpe(); |
1052 | 1040 | |
1053 | - // 同時接続対応 | |
1054 | - SktShareProh(); | |
1055 | - | |
1056 | 1041 | // ローカル側で選ばれているファイルをFileListBaseに登録 |
1057 | 1042 | FileListBase = NULL; |
1058 | 1043 | MakeDroppedFileList(wParam, Cur, &FileListBase); |
@@ -1212,9 +1197,6 @@ void MirrorUploadProc(int Notify) | ||
1212 | 1197 | { |
1213 | 1198 | DisableUserOpe(); |
1214 | 1199 | |
1215 | - // 同時接続対応 | |
1216 | - SktShareProh(); | |
1217 | - | |
1218 | 1200 | Base = NULL; |
1219 | 1201 | |
1220 | 1202 | if(Notify == YES) |
@@ -41,7 +41,9 @@ | ||
41 | 41 | #include <string.h> |
42 | 42 | #include <mbstring.h> |
43 | 43 | #include <time.h> |
44 | -#include <winsock.h> | |
44 | +// IPv6対応 | |
45 | +//#include <winsock.h> | |
46 | +#include <winsock2.h> | |
45 | 47 | #include <windowsx.h> |
46 | 48 | #include <commctrl.h> |
47 | 49 | #include <process.h> |
@@ -711,44 +713,53 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
711 | 713 | free(Pos); |
712 | 714 | } |
713 | 715 | NewCmdSkt = AskCmdCtrlSkt(); |
714 | - if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount()) | |
716 | + if(AskReuseCmdSkt() == YES && ThreadCount == 0) | |
715 | 717 | { |
716 | - if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt) | |
718 | + if(TransPacketBase && ThreadCount < AskMaxThreadCount()) | |
719 | + TrnSkt = AskTrnCtrlSkt(); | |
720 | + } | |
721 | + else | |
722 | + { | |
723 | + if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount()) | |
717 | 724 | { |
718 | - ReleaseMutex(hListAccMutex); | |
719 | - ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); | |
720 | - // 同時ログイン数制限に引っかかった可能性あり | |
721 | - // 負荷を下げるためにしばらく待機 | |
722 | - if(TrnSkt == INVALID_SOCKET) | |
725 | + if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt) | |
723 | 726 | { |
724 | - i = 10000; | |
725 | - while(NewCmdSkt != CmdSkt && i > 0) | |
727 | + ReleaseMutex(hListAccMutex); | |
728 | + ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); | |
729 | + // 同時ログイン数制限に引っかかった可能性あり | |
730 | + // 負荷を下げるためにしばらく待機 | |
731 | + if(TrnSkt == INVALID_SOCKET) | |
732 | + { | |
733 | + i = 10000; | |
734 | + while(NewCmdSkt != CmdSkt && i > 0) | |
735 | + { | |
736 | + BackgrndMessageProc(); | |
737 | + Sleep(1); | |
738 | + i--; | |
739 | + } | |
740 | + } | |
741 | +// WaitForSingleObject(hListAccMutex, INFINITE); | |
742 | + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
726 | 743 | { |
727 | 744 | BackgrndMessageProc(); |
728 | 745 | Sleep(1); |
729 | - i--; | |
730 | 746 | } |
731 | 747 | } |
732 | -// WaitForSingleObject(hListAccMutex, INFINITE); | |
733 | - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
734 | - { | |
735 | - BackgrndMessageProc(); | |
736 | - Sleep(1); | |
737 | - } | |
738 | 748 | } |
739 | - } | |
740 | - else | |
741 | - { | |
742 | - if(TrnSkt != INVALID_SOCKET) | |
749 | + else | |
743 | 750 | { |
744 | - ReleaseMutex(hListAccMutex); | |
745 | - DoClose(TrnSkt); | |
746 | - TrnSkt = INVALID_SOCKET; | |
747 | -// WaitForSingleObject(hListAccMutex, INFINITE); | |
748 | - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
751 | + if(TrnSkt != INVALID_SOCKET) | |
749 | 752 | { |
750 | - BackgrndMessageProc(); | |
751 | - Sleep(1); | |
753 | + ReleaseMutex(hListAccMutex); | |
754 | + SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); | |
755 | + DoClose(TrnSkt); | |
756 | + TrnSkt = INVALID_SOCKET; | |
757 | +// WaitForSingleObject(hListAccMutex, INFINITE); | |
758 | + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
759 | + { | |
760 | + BackgrndMessageProc(); | |
761 | + Sleep(1); | |
762 | + } | |
752 | 763 | } |
753 | 764 | } |
754 | 765 | } |
@@ -1017,7 +1028,8 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1017 | 1028 | // else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0) |
1018 | 1029 | else if(strcmp(Pos->Cmd, "SETCUR") == 0) |
1019 | 1030 | { |
1020 | - if(AskShareProh() == YES) | |
1031 | +// if(AskShareProh() == YES) | |
1032 | + if(AskReuseCmdSkt() == NO || AskShareProh() == YES) | |
1021 | 1033 | { |
1022 | 1034 | // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) |
1023 | 1035 | if(strcmp(CurDir[Pos->ThreadCount], Pos->RemoteFile) != 0) |
@@ -1038,7 +1050,8 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1038 | 1050 | // else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0) |
1039 | 1051 | else if(strcmp(Pos->Cmd, "BACKCUR") == 0) |
1040 | 1052 | { |
1041 | - if(AskShareProh() == NO) | |
1053 | +// if(AskShareProh() == NO) | |
1054 | + if(AskReuseCmdSkt() == YES && AskShareProh() == NO) | |
1042 | 1055 | { |
1043 | 1056 | // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) |
1044 | 1057 | // CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile); |
@@ -1172,8 +1185,14 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1172 | 1185 | Sleep(100); |
1173 | 1186 | } |
1174 | 1187 | } |
1175 | - if(TrnSkt != INVALID_SOCKET) | |
1176 | - DoClose(TrnSkt); | |
1188 | + if(AskReuseCmdSkt() == NO || ThreadCount > 0) | |
1189 | + { | |
1190 | + if(TrnSkt != INVALID_SOCKET) | |
1191 | + { | |
1192 | + SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); | |
1193 | + DoClose(TrnSkt); | |
1194 | + } | |
1195 | + } | |
1177 | 1196 | return 0; |
1178 | 1197 | } |
1179 | 1198 |
@@ -3722,6 +3741,59 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) | ||
3722 | 3741 | } |
3723 | 3742 | |
3724 | 3743 | |
3744 | +// IPv6対応 | |
3745 | +static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family) | |
3746 | +{ | |
3747 | + char *Pos; | |
3748 | + char *Btm; | |
3749 | + int Sts; | |
3750 | + | |
3751 | + Sts = FFFTP_FAIL; | |
3752 | + | |
3753 | + Pos = strchr(Str, '|'); | |
3754 | + if(Pos != NULL) | |
3755 | + { | |
3756 | + Pos++; | |
3757 | + Btm = strchr(Pos, '|'); | |
3758 | + if(Btm != NULL) | |
3759 | + { | |
3760 | + switch(atoi(Pos)) | |
3761 | + { | |
3762 | + case 1: | |
3763 | + *Family = AF_INET; | |
3764 | + break; | |
3765 | + case 2: | |
3766 | + *Family = AF_INET6; | |
3767 | + break; | |
3768 | + } | |
3769 | + Pos = Btm + 1; | |
3770 | + Btm = strchr(Pos, '|'); | |
3771 | + if(Btm != NULL) | |
3772 | + { | |
3773 | + if((Btm - Pos) <= Max) | |
3774 | + { | |
3775 | + if((Btm - Pos) > 0) | |
3776 | + { | |
3777 | + strncpy(Adrs, Pos, Btm - Pos); | |
3778 | + *(Adrs + (Btm - Pos)) = NUL; | |
3779 | + } | |
3780 | + | |
3781 | + Pos = Btm + 1; | |
3782 | + Btm = strchr(Pos, '|'); | |
3783 | + if(Btm != NULL) | |
3784 | + { | |
3785 | + Btm++; | |
3786 | + *Port = atoi(Pos); | |
3787 | + Sts = FFFTP_SUCCESS; | |
3788 | + } | |
3789 | + } | |
3790 | + } | |
3791 | + } | |
3792 | + } | |
3793 | + return(Sts); | |
3794 | +} | |
3795 | + | |
3796 | + | |
3725 | 3797 | /*----- Windowsのスペシャルデバイスかどうかを返す ----------------------------- |
3726 | 3798 | * |
3727 | 3799 | * Parameter |
@@ -231,6 +231,7 @@ static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New) | ||
231 | 231 | strcpy(New->PrivateKey, Host->PrivateKey); |
232 | 232 | // 同時接続対応 |
233 | 233 | New->MaxThreadCount = Host->MaxThreadCount; |
234 | + New->ReuseCmdSkt = Host->ReuseCmdSkt; | |
234 | 235 | // MLSD対応 |
235 | 236 | New->UseMLSD = Host->UseMLSD; |
236 | 237 | // IPv6対応 |
@@ -292,6 +293,7 @@ void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host) | ||
292 | 293 | strcpy(Host->PrivateKey, Hist->PrivateKey); |
293 | 294 | // 同時接続対応 |
294 | 295 | Host->MaxThreadCount = Hist->MaxThreadCount; |
296 | + Host->ReuseCmdSkt = Hist->ReuseCmdSkt; | |
295 | 297 | // MLSD対応 |
296 | 298 | Host->UseMLSD = Hist->UseMLSD; |
297 | 299 | // IPv6対応 |
@@ -1036,6 +1036,7 @@ int CopyHostFromListInConnect(int Num, HOSTDATA *Set) | ||
1036 | 1036 | Set->UseSFTP = Pos->Set.UseSFTP; |
1037 | 1037 | // 同時接続対応 |
1038 | 1038 | Set->MaxThreadCount = Pos->Set.MaxThreadCount; |
1039 | + Set->ReuseCmdSkt = Pos->Set.ReuseCmdSkt; | |
1039 | 1040 | // MLSD対応 |
1040 | 1041 | Set->UseMLSD = Pos->Set.UseMLSD; |
1041 | 1042 | // IPv6対応 |
@@ -1322,6 +1323,7 @@ void CopyDefaultHost(HOSTDATA *Set) | ||
1322 | 1323 | strcpy(Set->PrivateKey, ""); |
1323 | 1324 | // 同時接続対応 |
1324 | 1325 | Set->MaxThreadCount = 1; |
1326 | + Set->ReuseCmdSkt = NO; | |
1325 | 1327 | // MLSD対応 |
1326 | 1328 | Set->Feature = 0; |
1327 | 1329 | Set->UseMLSD = YES; |
@@ -2213,6 +2215,7 @@ static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LP | ||
2213 | 2215 | SendDlgItemMessage(hDlg, HSET_THREAD_COUNT, EM_LIMITTEXT, (WPARAM)1, 0); |
2214 | 2216 | SetDecimalText(hDlg, HSET_THREAD_COUNT, TmpHost.MaxThreadCount); |
2215 | 2217 | SendDlgItemMessage(hDlg, HSET_THREAD_COUNT_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_DATA_CONNECTION, 1)); |
2218 | + SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_SETCHECK, TmpHost.ReuseCmdSkt, 0); | |
2216 | 2219 | return(TRUE); |
2217 | 2220 | |
2218 | 2221 | case WM_NOTIFY: |
@@ -2222,6 +2225,7 @@ static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LP | ||
2222 | 2225 | case PSN_APPLY : |
2223 | 2226 | TmpHost.MaxThreadCount = GetDecimalText(hDlg, HSET_THREAD_COUNT); |
2224 | 2227 | CheckRange2(&TmpHost.MaxThreadCount, MAX_DATA_CONNECTION, 1); |
2228 | + TmpHost.ReuseCmdSkt = SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_GETCHECK, 0, 0); | |
2225 | 2229 | Apply = YES; |
2226 | 2230 | break; |
2227 | 2231 |
@@ -218,8 +218,6 @@ int MirUpDelNotify = YES; | ||
218 | 218 | int MirDownDelNotify = YES; |
219 | 219 | int FolderAttr = NO; |
220 | 220 | int FolderAttrNum = 777; |
221 | -// 同時接続対応 | |
222 | -int MaxThreadCount = 1; | |
223 | 221 | // 暗号化通信対応 |
224 | 222 | BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20]; |
225 | 223 |
@@ -479,6 +479,7 @@ void SaveRegistory(void) | ||
479 | 479 | SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey); |
480 | 480 | // 同時接続対応 |
481 | 481 | SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount); |
482 | + SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt); | |
482 | 483 | // MLSD対応 |
483 | 484 | SaveIntNum(hKey5, "MLSD", Hist.UseMLSD, DefaultHist.UseMLSD); |
484 | 485 | // IPv6対応 |
@@ -560,6 +561,7 @@ void SaveRegistory(void) | ||
560 | 561 | SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey); |
561 | 562 | // 同時接続対応 |
562 | 563 | SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount); |
564 | + SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt); | |
563 | 565 | // MLSD対応 |
564 | 566 | SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD); |
565 | 567 | // IPv6対応 |
@@ -832,6 +834,7 @@ int LoadRegistory(void) | ||
832 | 834 | DecodePassword(Str, Hist.PrivateKey); |
833 | 835 | // 同時接続対応 |
834 | 836 | ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount); |
837 | + ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt); | |
835 | 838 | // MLSD対応 |
836 | 839 | ReadIntValueFromReg(hKey5, "MLSD", &Hist.UseMLSD); |
837 | 840 | // IPv6対応 |
@@ -922,6 +925,7 @@ int LoadRegistory(void) | ||
922 | 925 | DecodePassword(Str, Host.PrivateKey); |
923 | 926 | // 同時接続対応 |
924 | 927 | ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount); |
928 | + ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt); | |
925 | 929 | // MLSD対応 |
926 | 930 | ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD); |
927 | 931 | // IPv6対応 |
@@ -28,6 +28,8 @@ | ||
28 | 28 | /============================================================================*/ |
29 | 29 | |
30 | 30 | #define STRICT |
31 | +// IPv6対応 | |
32 | +#include <ws2tcpip.h> | |
31 | 33 | #include <windows.h> |
32 | 34 | #include <stdio.h> |
33 | 35 | #include <stdlib.h> |
@@ -47,11 +49,12 @@ | ||
47 | 49 | |
48 | 50 | |
49 | 51 | |
50 | -#define FD_CONNECT_BIT 0x0001 | |
51 | -#define FD_CLOSE_BIT 0x0002 | |
52 | -#define FD_ACCEPT_BIT 0x0004 | |
53 | -#define FD_READ_BIT 0x0008 | |
54 | -#define FD_WRITE_BIT 0x0010 | |
52 | +// Winsock2で定義される定数と名前が重複し値が異なるため使用不可 | |
53 | +//#define FD_CONNECT_BIT 0x0001 | |
54 | +//#define FD_CLOSE_BIT 0x0002 | |
55 | +//#define FD_ACCEPT_BIT 0x0004 | |
56 | +//#define FD_READ_BIT 0x0008 | |
57 | +//#define FD_WRITE_BIT 0x0010 | |
55 | 58 | |
56 | 59 | |
57 | 60 |
@@ -79,8 +82,8 @@ typedef struct { | ||
79 | 82 | // 念のためテーブルを増量 |
80 | 83 | //#define MAX_SIGNAL_ENTRY 10 |
81 | 84 | //#define MAX_SIGNAL_ENTRY_DBASE 5 |
82 | -#define MAX_SIGNAL_ENTRY 100 | |
83 | -#define MAX_SIGNAL_ENTRY_DBASE 50 | |
85 | +#define MAX_SIGNAL_ENTRY 16 | |
86 | +#define MAX_SIGNAL_ENTRY_DBASE 16 | |
84 | 87 | |
85 | 88 | |
86 | 89 |
@@ -96,6 +99,8 @@ static int UnRegistAsyncTable(SOCKET s); | ||
96 | 99 | static int UnRegistAsyncTableDbase(HANDLE Async); |
97 | 100 | // UTF-8対応 |
98 | 101 | static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen); |
102 | +// IPv6対応 | |
103 | +static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family); | |
99 | 104 | |
100 | 105 | |
101 | 106 | /*===== 外部参照 =====*/ |
@@ -335,22 +340,22 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask) | ||
335 | 340 | *Error = Signal[Pos].Error; |
336 | 341 | if(Signal[Pos].Error != 0) |
337 | 342 | Sts = YES; |
338 | - if((Mask & FD_CONNECT_BIT) && (Signal[Pos].FdConnect != 0)) | |
343 | + if((Mask & FD_CONNECT) && (Signal[Pos].FdConnect != 0)) | |
339 | 344 | { |
340 | 345 | Sts = YES; |
341 | 346 | #if DBG_MSG |
342 | 347 | DoPrintf("### Ask: connect (Sts=%d, Error=%d)", Sts, *Error); |
343 | 348 | #endif |
344 | 349 | } |
345 | - if((Mask & FD_CLOSE_BIT) && (Signal[Pos].FdClose != 0)) | |
346 | -// if(Mask & FD_CLOSE_BIT) | |
350 | + if((Mask & FD_CLOSE) && (Signal[Pos].FdClose != 0)) | |
351 | +// if(Mask & FD_CLOSE) | |
347 | 352 | { |
348 | 353 | Sts = YES; |
349 | 354 | #if DBG_MSG |
350 | 355 | DoPrintf("### Ask: close (Sts=%d, Error=%d)", Sts, *Error); |
351 | 356 | #endif |
352 | 357 | } |
353 | - if((Mask & FD_ACCEPT_BIT) && (Signal[Pos].FdAccept != 0)) | |
358 | + if((Mask & FD_ACCEPT) && (Signal[Pos].FdAccept != 0)) | |
354 | 359 | { |
355 | 360 | Signal[Pos].FdAccept = 0; |
356 | 361 | Sts = YES; |
@@ -358,7 +363,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask) | ||
358 | 363 | DoPrintf("### Ask: accept (Sts=%d, Error=%d)", Sts, *Error); |
359 | 364 | #endif |
360 | 365 | } |
361 | - if((Mask & FD_READ_BIT) && (Signal[Pos].FdRead != 0)) | |
366 | + if((Mask & FD_READ) && (Signal[Pos].FdRead != 0)) | |
362 | 367 | { |
363 | 368 | Signal[Pos].FdRead = 0; |
364 | 369 | Sts = YES; |
@@ -366,7 +371,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask) | ||
366 | 371 | DoPrintf("### Ask: read (Sts=%d, Error=%d)", Sts, *Error); |
367 | 372 | #endif |
368 | 373 | } |
369 | - if((Mask & FD_WRITE_BIT) && (Signal[Pos].FdWrite != 0)) | |
374 | + if((Mask & FD_WRITE) && (Signal[Pos].FdWrite != 0)) | |
370 | 375 | { |
371 | 376 | Signal[Pos].FdWrite = 0; |
372 | 377 | Sts = YES; |
@@ -382,7 +387,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask) | ||
382 | 387 | |
383 | 388 | if(Pos == MAX_SIGNAL_ENTRY) |
384 | 389 | { |
385 | - if(Mask & FD_CLOSE_BIT) | |
390 | + if(Mask & FD_CLOSE) | |
386 | 391 | { |
387 | 392 | Sts = YES; |
388 | 393 | } |
@@ -662,7 +667,9 @@ struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *Canc | ||
662 | 667 | |
663 | 668 | // UTF-8対応 |
664 | 669 | // hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); |
665 | - hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); | |
670 | + // IPv6対応 | |
671 | +// hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); | |
672 | + hAsync = WSAAsyncGetHostByNameIPv6M(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len, AF_INET); | |
666 | 673 | if(hAsync != NULL) |
667 | 674 | { |
668 | 675 | RegistAsyncTableDbase(hAsync); |
@@ -731,7 +738,7 @@ int do_closesocket(SOCKET s) | ||
731 | 738 | if(Ret == SOCKET_ERROR) |
732 | 739 | { |
733 | 740 | Error = 0; |
734 | - while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE_BIT) != YES)) | |
741 | + while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE) != YES)) | |
735 | 742 | { |
736 | 743 | Sleep(1); |
737 | 744 | if(BackgrndMessageProc() == YES) |
@@ -778,7 +785,9 @@ int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCh | ||
778 | 785 | #if DBG_MSG |
779 | 786 | DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); |
780 | 787 | #endif |
781 | - Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); | |
788 | + // 高速化のためFD_READとFD_WRITEを使用しない | |
789 | +// Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); | |
790 | + Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT); | |
782 | 791 | if(Ret != SOCKET_ERROR) |
783 | 792 | { |
784 | 793 | Ret = connect(s, name, namelen); |
@@ -787,7 +796,7 @@ int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCh | ||
787 | 796 | do |
788 | 797 | { |
789 | 798 | Error = 0; |
790 | - while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT_BIT) != YES)) | |
799 | + while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT) != YES)) | |
791 | 800 | { |
792 | 801 | Sleep(1); |
793 | 802 | if(BackgrndMessageProc() == YES) |
@@ -859,9 +868,9 @@ SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen) | ||
859 | 868 | Ret2 = INVALID_SOCKET; |
860 | 869 | Error = 0; |
861 | 870 | |
862 | - while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT_BIT) != YES)) | |
871 | + while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT) != YES)) | |
863 | 872 | { |
864 | - if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) | |
873 | + if(AskAsyncDone(s, &Error, FD_CLOSE) == YES) | |
865 | 874 | { |
866 | 875 | Error = 1; |
867 | 876 | break; |
@@ -947,29 +956,30 @@ int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOutErr, int *Cance | ||
947 | 956 | |
948 | 957 | // FTPS対応 |
949 | 958 | // OpenSSLでは受信確認はFD_READが複数回受信される可能性がある |
950 | -// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES)) | |
951 | - while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES)) | |
952 | - { | |
953 | - if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) | |
954 | - { | |
955 | - Ret = 0; | |
956 | - break; | |
957 | - } | |
958 | - Sleep(1); | |
959 | - if(BackgrndMessageProc() == YES) | |
960 | - *CancelCheckWork = YES; | |
961 | - else if(TimeOut != 0) | |
962 | - { | |
963 | - time(&ElapseTime); | |
964 | - ElapseTime -= StartTime; | |
965 | - if(ElapseTime >= TimeOut) | |
966 | - { | |
967 | - DoPrintf("do_recv timed out"); | |
968 | - *TimeOutErr = YES; | |
969 | - *CancelCheckWork = YES; | |
970 | - } | |
971 | - } | |
972 | - } | |
959 | +// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ) != YES)) | |
960 | + // 短時間にFD_READが2回以上通知される対策 | |
961 | +// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ) != YES)) | |
962 | +// { | |
963 | +// if(AskAsyncDone(s, &Error, FD_CLOSE) == YES) | |
964 | +// { | |
965 | +// Ret = 0; | |
966 | +// break; | |
967 | +// } | |
968 | +// Sleep(1); | |
969 | +// if(BackgrndMessageProc() == YES) | |
970 | +// *CancelCheckWork = YES; | |
971 | +// else if(TimeOut != 0) | |
972 | +// { | |
973 | +// time(&ElapseTime); | |
974 | +// ElapseTime -= StartTime; | |
975 | +// if(ElapseTime >= TimeOut) | |
976 | +// { | |
977 | +// DoPrintf("do_recv timed out"); | |
978 | +// *TimeOutErr = YES; | |
979 | +// *CancelCheckWork = YES; | |
980 | +// } | |
981 | +// } | |
982 | +// } | |
973 | 983 | |
974 | 984 | if(/*(Ret != 0) && */(Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO)) |
975 | 985 | { |
@@ -1055,11 +1065,11 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int | ||
1055 | 1065 | |
1056 | 1066 | // FTPS対応 |
1057 | 1067 | // 送信バッファの空き確認には影響しないが念のため |
1058 | -// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) | |
1068 | +// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE) != YES)) | |
1059 | 1069 | // Windows 2000でFD_WRITEが通知されないことがあるバグ修正 |
1060 | -// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) | |
1070 | +// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE) != YES)) | |
1061 | 1071 | // { |
1062 | -// if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) | |
1072 | +// if(AskAsyncDone(s, &Error, FD_CLOSE) == YES) | |
1063 | 1073 | // { |
1064 | 1074 | // Error = 1; |
1065 | 1075 | // break; |
@@ -1145,7 +1155,7 @@ void RemoveReceivedData(SOCKET s) | ||
1145 | 1155 | int Error; |
1146 | 1156 | while((len = recvS(s, buf, sizeof(buf), MSG_PEEK)) >= 0) |
1147 | 1157 | { |
1148 | - AskAsyncDone(s, &Error, FD_READ_BIT); | |
1158 | + AskAsyncDone(s, &Error, FD_READ); | |
1149 | 1159 | recvS(s, buf, len, 0); |
1150 | 1160 | } |
1151 | 1161 | } |
@@ -1168,7 +1178,7 @@ int CheckClosedAndReconnect(void) | ||
1168 | 1178 | //SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); |
1169 | 1179 | |
1170 | 1180 | Sts = FFFTP_SUCCESS; |
1171 | - if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE_BIT) == YES) | |
1181 | + if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE) == YES) | |
1172 | 1182 | { |
1173 | 1183 | Sts = ReConnectCmdSkt(); |
1174 | 1184 | } |
@@ -1177,6 +1187,138 @@ int CheckClosedAndReconnect(void) | ||
1177 | 1187 | |
1178 | 1188 | |
1179 | 1189 | |
1190 | +// IPv6対応 | |
1191 | + | |
1192 | +typedef struct | |
1193 | +{ | |
1194 | + HANDLE h; | |
1195 | + HWND hWnd; | |
1196 | + u_int wMsg; | |
1197 | + char * name; | |
1198 | + char * buf; | |
1199 | + int buflen; | |
1200 | + short Family; | |
1201 | +} GETHOSTBYNAMEDATA; | |
1202 | + | |
1203 | +static DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter) | |
1204 | +{ | |
1205 | + GETHOSTBYNAMEDATA* pData; | |
1206 | + struct hostent* pHost; | |
1207 | + struct addrinfo* pAddr; | |
1208 | + struct addrinfo* p; | |
1209 | + pHost = NULL; | |
1210 | + pData = (GETHOSTBYNAMEDATA*)lpParameter; | |
1211 | + if(getaddrinfo(pData->name, NULL, NULL, &pAddr) == 0) | |
1212 | + { | |
1213 | + p = pAddr; | |
1214 | + while(p) | |
1215 | + { | |
1216 | + if(p->ai_family == pData->Family) | |
1217 | + { | |
1218 | + switch(p->ai_family) | |
1219 | + { | |
1220 | + case AF_INET: | |
1221 | + pHost = (struct hostent*)pData->buf; | |
1222 | + if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr) | |
1223 | + && p->ai_addrlen >= sizeof(struct sockaddr_in)) | |
1224 | + { | |
1225 | + pHost->h_name = NULL; | |
1226 | + pHost->h_aliases = NULL; | |
1227 | + pHost->h_addrtype = p->ai_family; | |
1228 | + pHost->h_length = sizeof(struct in_addr); | |
1229 | + pHost->h_addr_list = (char**)(&pHost[1]); | |
1230 | + pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]); | |
1231 | + pHost->h_addr_list[1] = NULL; | |
1232 | + memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr)); | |
1233 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen)); | |
1234 | + } | |
1235 | + else | |
1236 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16)); | |
1237 | + break; | |
1238 | + case AF_INET6: | |
1239 | + pHost = (struct hostent*)pData->buf; | |
1240 | + if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr) | |
1241 | + && p->ai_addrlen >= sizeof(struct sockaddr_in6)) | |
1242 | + { | |
1243 | + pHost->h_name = NULL; | |
1244 | + pHost->h_aliases = NULL; | |
1245 | + pHost->h_addrtype = p->ai_family; | |
1246 | + pHost->h_length = sizeof(struct in6_addr); | |
1247 | + pHost->h_addr_list = (char**)(&pHost[1]); | |
1248 | + pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]); | |
1249 | + pHost->h_addr_list[1] = NULL; | |
1250 | + memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr)); | |
1251 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen)); | |
1252 | + } | |
1253 | + else | |
1254 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16)); | |
1255 | + break; | |
1256 | + } | |
1257 | + } | |
1258 | + if(pHost) | |
1259 | + break; | |
1260 | + p = p->ai_next; | |
1261 | + } | |
1262 | + if(!p) | |
1263 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16)); | |
1264 | + freeaddrinfo(pAddr); | |
1265 | + } | |
1266 | + else | |
1267 | + PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16)); | |
1268 | + free(pData->name); | |
1269 | + free(pData); | |
1270 | + // CreateThreadが返すハンドルが重複するのを回避 | |
1271 | + Sleep(10000); | |
1272 | + return 0; | |
1273 | +} | |
1274 | + | |
1275 | +// IPv6対応のWSAAsyncGetHostByName相当の関数 | |
1276 | +// FamilyにはAF_INETまたはAF_INET6を指定可能 | |
1277 | +// ただしANSI用 | |
1278 | +static HANDLE WSAAsyncGetHostByNameIPv6(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family) | |
1279 | +{ | |
1280 | + HANDLE hResult; | |
1281 | + GETHOSTBYNAMEDATA* pData; | |
1282 | + hResult = NULL; | |
1283 | + if(pData = malloc(sizeof(GETHOSTBYNAMEDATA))) | |
1284 | + { | |
1285 | + pData->hWnd = hWnd; | |
1286 | + pData->wMsg = wMsg; | |
1287 | + if(pData->name = malloc(sizeof(char) * (strlen(name) + 1))) | |
1288 | + { | |
1289 | + strcpy(pData->name, name); | |
1290 | + pData->buf = buf; | |
1291 | + pData->buflen = buflen; | |
1292 | + pData->Family = Family; | |
1293 | + if(pData->h = CreateThread(NULL, 0, WSAAsyncGetHostByNameIPv6ThreadProc, pData, CREATE_SUSPENDED, NULL)) | |
1294 | + { | |
1295 | + ResumeThread(pData->h); | |
1296 | + hResult = pData->h; | |
1297 | + } | |
1298 | + } | |
1299 | + } | |
1300 | + if(!hResult) | |
1301 | + { | |
1302 | + if(pData) | |
1303 | + { | |
1304 | + if(pData->name) | |
1305 | + free(pData->name); | |
1306 | + free(pData); | |
1307 | + } | |
1308 | + } | |
1309 | + return hResult; | |
1310 | +} | |
1311 | + | |
1312 | +// WSAAsyncGetHostByNameIPv6用のWSACancelAsyncRequest相当の関数 | |
1313 | +int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle) | |
1314 | +{ | |
1315 | + int Result; | |
1316 | + Result = SOCKET_ERROR; | |
1317 | + if(TerminateThread(hAsyncTaskHandle, 0)) | |
1318 | + Result = 0; | |
1319 | + return Result; | |
1320 | +} | |
1321 | + | |
1180 | 1322 | // UTF-8対応 |
1181 | 1323 | |
1182 | 1324 | static BOOL ConvertStringToPunycode(LPSTR Output, DWORD Count, LPCSTR Input) |
@@ -1279,3 +1421,16 @@ static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, c | ||
1279 | 1421 | return r; |
1280 | 1422 | } |
1281 | 1423 | |
1424 | +static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family) | |
1425 | +{ | |
1426 | + HANDLE r = NULL; | |
1427 | + char* pa0 = NULL; | |
1428 | + if(pa0 = AllocateStringA(strlen(name) * 4)) | |
1429 | + { | |
1430 | + if(ConvertNameToPunycode(pa0, name)) | |
1431 | + r = WSAAsyncGetHostByNameIPv6(hWnd, wMsg, pa0, buf, buflen, Family); | |
1432 | + } | |
1433 | + FreeDuplicatedString(pa0); | |
1434 | + return r; | |
1435 | +} | |
1436 | + |
@@ -70,7 +70,7 @@ _X509_print_ex p_X509_print_ex; | ||
70 | 70 | _X509_get_subject_name p_X509_get_subject_name; |
71 | 71 | _X509_NAME_print_ex p_X509_NAME_print_ex; |
72 | 72 | |
73 | -#define MAX_SSL_SOCKET 64 | |
73 | +#define MAX_SSL_SOCKET 16 | |
74 | 74 | |
75 | 75 | BOOL g_bOpenSSLLoaded; |
76 | 76 | HMODULE g_hOpenSSL; |