OSDN Git Service

Add support for simultaneous connection for file transfer (sometimes freezes).
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 19 Sep 2011 04:26:00 +0000 (13:26 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 19 Sep 2011 04:26:00 +0000 (13:26 +0900)
33 files changed:
FFFTP.vc90.vcproj
FFFTP.vcproj
FFFTP_Eng_Release/FFFTP.exe
FFFTP_English.vc90.vcproj
FFFTP_English.vcproj
Release/FFFTP.exe
Resource/FFFTP.APS
Resource/FFFTP.rc
Resource/Thumbs.db [deleted file]
Resource/resource.h
Resource_eng/FFFTP-eng.aps [deleted file]
Resource_eng/FFFTP-eng.rc
Resource_eng/Thumbs.db [deleted file]
Resource_eng/resource.h
common.h
config.h
connect.c
ftpproc.c
getput.c
history.c
hostman.c
main.c
mbswrapper.c
mbswrapper.h
mesg-eng.h
mesg-eng.old.h
mesg-jpn.h
mesg-jpn.old.h
option.c
registory.c
remote.c
socket.c
socketwrapper.c

index e7124f0..6ea6f40 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="shift_jis"?>
+<?xml version="1.0" encoding="shift_jis"?>
 <VisualStudioProject
        ProjectType="Visual C++"
        Version="9.00"
index e69c1c0..ad16916 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="shift_jis"?>\r
+<?xml version="1.0" encoding="shift_jis"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
        Version="8.00"\r
index 22de8db..27cc9ea 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 8729b86..3226993 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="shift_jis"?>
+<?xml version="1.0" encoding="shift_jis"?>
 <VisualStudioProject
        ProjectType="Visual C++"
        Version="9.00"
index d4127ef..d2c99af 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="shift_jis"?>\r
+<?xml version="1.0" encoding="shift_jis"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
        Version="8.00"\r
index cb128cd..620f4cc 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index d5fd2eb..fe0460b 100644 (file)
Binary files a/Resource/FFFTP.APS and b/Resource/FFFTP.APS differ
index af6bc89..23d7824 100644 (file)
@@ -1351,6 +1351,16 @@ BEGIN
     CONTROL         "SFTP\82Å\90Ú\91±",HSET_SFTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,148,10\r
 END\r
 \r
+hset_adv3_dlg DIALOG  0, 0, 207, 139\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "\82l\82\82o\83S\83V\83b\83N"\r
+BEGIN\r
+    LTEXT           "\8dÅ\91å\93¯\8e\9e\90Ú\91±\90\94",-1,7,10,64,8\r
+    EDITTEXT        HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER\r
+    CONTROL         "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14\r
+    LTEXT           "(1\81`4)",-1,102,10,31,8\r
+END\r
+\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
@@ -1974,6 +1984,14 @@ BEGIN
         TOPMARGIN, 7\r
         BOTTOMMARGIN, 132\r
     END\r
+\r
+    hset_adv3_dlg, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 200\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 132\r
+    END\r
 END\r
 #endif    // APSTUDIO_INVOKED\r
 \r
diff --git a/Resource/Thumbs.db b/Resource/Thumbs.db
deleted file mode 100644 (file)
index f1a83ff..0000000
Binary files a/Resource/Thumbs.db and /dev/null differ
index 73cbf19..4074089 100644 (file)
 #define newmasterpasswd_dlg             187\r
 #define masterpasswd_dlg                188\r
 #define hset_crypt_dlg                  189\r
+#define hset_adv3_dlg                   190\r
 #define TRANS_TIME_BAR                  1002\r
 #define TRANS_TEXT                      1003\r
 #define TRANS_REMOTE                    1003\r
 #define HSET_FTPES                      1198\r
 #define HSET_FTPIS                      1199\r
 #define HSET_SFTP                       1200\r
+#define HSET_THREAD_COUNT               1201\r
+#define HSET_THREAD_COUNT_SPN           1202\r
 #define MENU_END                        40001\r
 #define MENU_EXIT                       40001\r
 #define MENU_CONNECT                    40003\r
 // \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
-#define _APS_NEXT_RESOURCE_VALUE        190\r
+#define _APS_NEXT_RESOURCE_VALUE        191\r
 #define _APS_NEXT_COMMAND_VALUE         40175\r
-#define _APS_NEXT_CONTROL_VALUE         1201\r
+#define _APS_NEXT_CONTROL_VALUE         1203\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
 #endif\r
diff --git a/Resource_eng/FFFTP-eng.aps b/Resource_eng/FFFTP-eng.aps
deleted file mode 100644 (file)
index 8baa85e..0000000
Binary files a/Resource_eng/FFFTP-eng.aps and /dev/null differ
index 06f5ca9..135de65 100644 (file)
@@ -1376,6 +1376,16 @@ BEGIN
     CONTROL         "Connect with SFTP",HSET_SFTP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,148,10\r
 END\r
 \r
+hset_adv3_dlg DIALOG  0, 0, 207, 139\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "MS Sans Serif"\r
+BEGIN\r
+    LTEXT           "Max Connections",-1,7,10,64,8\r
+    EDITTEXT        HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER\r
+    CONTROL         "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14\r
+    LTEXT           "(1 to 4 threads)",-1,102,10,53,8\r
+END\r
+\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
@@ -1996,6 +2006,14 @@ BEGIN
         TOPMARGIN, 7\r
         BOTTOMMARGIN, 132\r
     END\r
+\r
+    hset_adv3_dlg, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 200\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 132\r
+    END\r
 END\r
 #endif    // APSTUDIO_INVOKED\r
 \r
diff --git a/Resource_eng/Thumbs.db b/Resource_eng/Thumbs.db
deleted file mode 100644 (file)
index bbc883b..0000000
Binary files a/Resource_eng/Thumbs.db and /dev/null differ
index 4cbdf59..b3a8497 100644 (file)
 #define newmasterpasswd_dlg             187\r
 #define masterpasswd_dlg                188\r
 #define hset_crypt_dlg                  189\r
+#define hset_adv3_dlg                   190\r
 #define TRANS_TIME_BAR                  1002\r
 #define TRANS_TEXT                      1003\r
 #define TRANS_REMOTE                    1003\r
 #define HSET_FTPES                      1198\r
 #define HSET_FTPIS                      1199\r
 #define HSET_SFTP                       1200\r
+#define HSET_THREAD_COUNT               1201\r
+#define HSET_THREAD_COUNT_SPN           1202\r
 #define MENU_END                        40001\r
 #define MENU_EXIT                       40001\r
 #define MENU_CONNECT                    40003\r
 // \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
-#define _APS_NEXT_RESOURCE_VALUE        190\r
+#define _APS_NEXT_RESOURCE_VALUE        191\r
 #define _APS_NEXT_COMMAND_VALUE         40175\r
-#define _APS_NEXT_CONTROL_VALUE         1201\r
+#define _APS_NEXT_CONTROL_VALUE         1203\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
 #endif\r
index 2bdd54b..97480ae 100644 (file)
--- a/common.h
+++ b/common.h
@@ -914,6 +914,8 @@ typedef struct {
        int UseFTPES;                                           /* FTPESで接続する (YES/NO) */\r
        int UseFTPIS;                                           /* FTPISで接続する (YES/NO) */\r
        int UseSFTP;                                            /* SFTPで接続する (YES/NO) */\r
+       // 同時接続対応\r
+       int MaxThreadCount;                                     /* 同時接続数 */\r
 } HOSTDATA;\r
 \r
 \r
@@ -964,6 +966,8 @@ typedef struct historydata {
        int UseFTPES;                                           /* FTPESで接続する (YES/NO) */\r
        int UseFTPIS;                                           /* FTPISで接続する (YES/NO) */\r
        int UseSFTP;                                            /* SFTPで接続する (YES/NO) */\r
+       // 同時接続対応\r
+       int MaxThreadCount;                                     /* 同時接続数 */\r
        struct historydata *Next;\r
 } HISTORYDATA;\r
 \r
@@ -992,6 +996,8 @@ typedef struct transpacket {
        int Abort;                                              /* 転送中止フラグ (ABORT_xxx) */\r
        // 暗号化通信対応\r
        int CryptMode;                                  /* 暗号化通信モード (CRYPT_xxx) */\r
+       // 同時接続対応\r
+       int ThreadCount;\r
        struct transpacket *Next;\r
 } TRANSPACKET;\r
 \r
@@ -1263,13 +1269,12 @@ void SetHostKanjiCode(int Type);
 void DispHostKanjiCode(void);\r
 int AskHostKanjiCode(void);\r
 void HideHostKanjiButton(void);\r
-// ローカルの漢字コード\r
+// UTF-8対応\r
 void SetLocalKanjiCodeImm(int Mode);\r
 void SetLocalKanjiCode(int Type);\r
 void DispLocalKanjiCode(void);\r
 int AskLocalKanjiCode(void);\r
 void HideLocalKanjiButton(void);\r
-// ここまで\r
 void SetHostKanaCnvImm(int Mode);\r
 void SetHostKanaCnv(void);\r
 void DispHostKanaCnv(void);\r
@@ -1356,6 +1361,8 @@ char *AskHostUserName(void);
 void SaveCurrentSetToHost(void);\r
 int ReConnectCmdSkt(void);\r
 // int ReConnectTrnSkt(void);\r
+// 同時接続対応\r
+int ReConnectTrnSkt(SOCKET *Skt);\r
 SOCKET AskCmdCtrlSkt(void);\r
 SOCKET AskTrnCtrlSkt(void);\r
 void SktShareProh(void);\r
@@ -1372,6 +1379,8 @@ int AskCryptMode(void);
 int AskUseFTPES(void);\r
 int AskUseFTPIS(void);\r
 int AskUseSFTP(void);\r
+// 同時接続対応\r
+int AskMaxThreadCount(void);\r
 \r
 /*===== cache.c =====*/\r
 \r
@@ -1441,14 +1450,19 @@ int DoRMD(char *Path);
 int DoDELE(char *Path);\r
 int DoRENAME(char *Src, char *Dst);\r
 int DoCHMOD(char *Path, char *Mode);\r
-int DoSIZE(char *Path, LONGLONG *Size);\r
-int DoMDTM(char *Path, FILETIME *Time);\r
+// 同時接続対応\r
+//int DoSIZE(char *Path, LONGLONG *Size);\r
+//int DoMDTM(char *Path, FILETIME *Time);\r
+int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size);\r
+int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time);\r
 int DoQUOTE(char *CmdStr);\r
 SOCKET DoClose(SOCKET Sock);\r
 int DoQUIT(SOCKET ctrl_skt);\r
 int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork);\r
 int CommandProcCmd(char *Reply, char *fmt, ...);\r
-int CommandProcTrn(char *Reply, char *fmt, ...);\r
+// 同時接続対応\r
+//int CommandProcTrn(char *Reply, char *fmt, ...);\r
+int CommandProcTrn(SOCKET cSkt, char *Reply, char *fmt, ...);\r
 int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...);\r
 int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork);\r
 int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp);\r
@@ -1500,6 +1514,13 @@ int CheckKanjiCode(char *Text, int Size, int Pref);
 \r
 void SetOption(int Start);\r
 int SortSetting(void);\r
+// hostman.cで使用\r
+int GetDecimalText(HWND hDlg, int Ctrl);\r
+void SetDecimalText(HWND hDlg, int Ctrl, int Num);\r
+void CheckRange2(int *Cur, int Max, int Min);\r
+void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize);\r
+void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text);\r
+void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize);\r
 \r
 /*===== bookmark.c =====*/\r
 \r
index c35974c..79ca376 100644 (file)
--- a/config.h
+++ b/config.h
@@ -15,4 +15,6 @@
 #define DISABLE_CONTROL_NETWORK_BUFFERS\r
 // JRE32.DLLを無効にする(UTF-8に非対応のため)\r
 #define DISABLE_JRE32DLL\r
+// ファイル転送の同時接続数\r
+#define MAX_DATA_CONNECTION 4\r
 \r
index b37571c..515cdaa 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -915,12 +915,24 @@ static void SaveCurrentSetToHistory(void)
 int ReConnectCmdSkt(void)\r
 {\r
        int Sts;\r
+       SOCKET s;\r
 \r
-       if(CmdCtrlSocket != TrnCtrlSocket)\r
-               do_closesocket(TrnCtrlSocket);\r
+\r
+       // 同時接続対応\r
+//     if(CmdCtrlSocket != TrnCtrlSocket)\r
+//             do_closesocket(TrnCtrlSocket);\r
+//     TrnCtrlSocket = INVALID_SOCKET;\r
+       s = TrnCtrlSocket;\r
        TrnCtrlSocket = INVALID_SOCKET;\r
+       if(CmdCtrlSocket != s && s != INVALID_SOCKET)\r
+               do_closesocket(s);\r
 \r
-       Sts = ReConnectSkt(&CmdCtrlSocket);\r
+       // 同時接続対応\r
+//     Sts = ReConnectSkt(&CmdCtrlSocket);\r
+       s = CmdCtrlSocket;\r
+       CmdCtrlSocket = INVALID_SOCKET;\r
+       Sts = ReConnectSkt(&s);\r
+       CmdCtrlSocket = s;\r
 \r
        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
@@ -942,6 +954,33 @@ int ReConnectCmdSkt(void)
 //{\r
 //     return(ReConnectSkt(&TrnCtrlSocket));\r
 //}\r
+// 同時接続対応\r
+int ReConnectTrnSkt(SOCKET *Skt)\r
+{\r
+       char Path[FMAX_PATH+1];\r
+       int Sts;\r
+\r
+       Sts = FFFTP_FAIL;\r
+\r
+       SetTaskMsg(MSGJPN003);\r
+\r
+       DisableUserOpe();\r
+       /* 現在のソケットは切断 */\r
+       if(*Skt != INVALID_SOCKET)\r
+               do_closesocket(*Skt);\r
+       /* 再接続 */\r
+       if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+       {\r
+               AskRemoteCurDir(Path, FMAX_PATH);\r
+//             DoCWD(Path, YES, YES, YES);\r
+               Sts = FFFTP_SUCCESS;\r
+       }\r
+       else\r
+               SoundPlay(SND_ERROR);\r
+\r
+       EnableUserOpe();\r
+       return(Sts);\r
+}\r
 \r
 \r
 /*----- 回線の再接続 ----------------------------------------------------------\r
@@ -1028,8 +1067,11 @@ void SktShareProh(void)
 \r
 //SetTaskMsg("############### SktShareProh");\r
 \r
-               CmdCtrlSocket = INVALID_SOCKET;\r
-               ReConnectSkt(&CmdCtrlSocket);\r
+               // 同時接続対応\r
+               // 転送スレッドがソケットを各自で用意\r
+               // TrnCtrlSocketはメインスレッド以外から使用されない\r
+//             CmdCtrlSocket = INVALID_SOCKET;\r
+//             ReConnectSkt(&CmdCtrlSocket);\r
        }\r
        return;\r
 }\r
@@ -2190,3 +2232,9 @@ int AskUseSFTP(void)
        return(CurHost.UseSFTP);\r
 }\r
 \r
+// 同時接続対応\r
+int AskMaxThreadCount(void)\r
+{\r
+       return(CurHost.MaxThreadCount);\r
+}\r
+\r
index c71194a..7fdef82 100644 (file)
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -126,6 +126,9 @@ void DownLoadProc(int ChName, int ForceFile, int All)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                ExistNotify = YES;\r
 //             KeepTransferDialog(YES);\r
 \r
@@ -254,6 +257,9 @@ void DirectDownLoadProc(char *Fname)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                ExistNotify = YES;\r
 //             KeepTransferDialog(YES);\r
 \r
@@ -390,6 +396,9 @@ void MirrorDownloadProc(int Notify)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                Base = NULL;\r
 \r
                if(Notify == YES)\r
@@ -858,6 +867,9 @@ void UpLoadListProc(int ChName, int All)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                // ローカル側で選ばれているファイルをFileListBaseに登録\r
                FileListBase = NULL;\r
                MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);\r
@@ -1023,6 +1035,9 @@ void UpLoadDragProc(WPARAM wParam)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                // ローカル側で選ばれているファイルをFileListBaseに登録\r
                FileListBase = NULL;\r
                MakeDroppedFileList(wParam, Cur, &FileListBase);\r
@@ -1179,6 +1194,9 @@ void MirrorUploadProc(int Notify)
        {\r
                DisableUserOpe();\r
 \r
+               // 同時接続対応\r
+               SktShareProh();\r
+\r
                Base = NULL;\r
 \r
                if(Notify == YES)\r
@@ -3142,7 +3160,9 @@ int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type)
                        if(Type == 0)\r
                                Cmd = CommandProcCmd(NULL, "CWD %s", Tmp);\r
                        else\r
-                               Cmd = CommandProcTrn(NULL, "CWD %s", Tmp);\r
+                               // 同時接続対応\r
+//                             Cmd = CommandProcTrn(NULL, "CWD %s", Tmp);\r
+                               Cmd = CommandProcTrn((SOCKET)(Type - 1), NULL, "CWD %s", Tmp);\r
 \r
                        if(Cmd/100 != FTP_COMPLETE)\r
                        {\r
index 9573c3e..5a3b750 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -94,7 +94,9 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt);
 static int UpLoadNonPassive(TRANSPACKET *Pkt);\r
 static int UpLoadPassive(TRANSPACKET *Pkt);\r
 static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt);\r
-static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii);\r
+// 同時接続対応\r
+//static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii);\r
+static int TermCodeConvAndSend(int ThreadCount, TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii);\r
 static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode);\r
 static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode);\r
 static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);\r
@@ -108,7 +110,9 @@ static void SetErrorMsg(char *fmt, ...);
 \r
 /*===== ローカルなワーク =====*/\r
 \r
-static HANDLE hTransferThread;\r
+// 同時接続対応\r
+//static HANDLE hTransferThread;\r
+static HANDLE hTransferThread[MAX_DATA_CONNECTION];\r
 static int fTransferThreadExit = FALSE;\r
 \r
 static HANDLE hRunMutex;                               /* 転送スレッド実行ミューテックス */\r
@@ -117,14 +121,19 @@ static HANDLE hListAccMutex;                      /* 転送ファイルアクセス用ミューテ
 static int TransFiles = 0;                             /* 転送待ちファイル数 */\r
 static TRANSPACKET *TransPacketBase = NULL;    /* 転送ファイルリスト */\r
 \r
-static int Canceled;           /* 中止フラグ YES/NO */\r
+// 同時接続対応\r
+//static int Canceled;         /* 中止フラグ YES/NO */\r
+static int Canceled[MAX_DATA_CONNECTION];              /* 中止フラグ YES/NO */\r
 static int ClearAll;           /* 全て中止フラグ YES/NO */\r
 \r
 static int ForceAbort;         /* 転送中止フラグ */\r
                                                        /* このフラグはスレッドを終了させるときに使う */\r
 \r
-static LONGLONG AllTransSizeNow;       /* 今回の転送で転送したサイズ */\r
-static time_t TimeStart;       /* 転送開始時間 */\r
+// 同時接続対応\r
+//static LONGLONG AllTransSizeNow;     /* 今回の転送で転送したサイズ */\r
+//static time_t TimeStart;     /* 転送開始時間 */\r
+static LONGLONG AllTransSizeNow[MAX_DATA_CONNECTION];  /* 今回の転送で転送したサイズ */\r
+static time_t TimeStart[MAX_DATA_CONNECTION];  /* 転送開始時間 */\r
 \r
 static int KeepDlg = NO;       /* 転送中ダイアログを消さないかどうか (YES/NO) */\r
 static int MoveToForeground = NO;              /* ウインドウを前面に移動するかどうか (YES/NO) */\r
@@ -157,6 +166,7 @@ extern int FolderAttrNum;
 int MakeTransferThread(void)\r
 {\r
        DWORD dwID;\r
+       int i;\r
 \r
        hListAccMutex = CreateMutex( NULL, FALSE, NULL );\r
        hRunMutex = CreateMutex( NULL, TRUE, NULL );\r
@@ -165,9 +175,16 @@ int MakeTransferThread(void)
        ForceAbort = NO;\r
 \r
        fTransferThreadExit = FALSE;\r
-       hTransferThread = (HANDLE)_beginthreadex(NULL, 0, TransferThread, 0, 0, &dwID);\r
-       if (hTransferThread == NULL)\r
-               return(FFFTP_FAIL); /* XXX */\r
+       // 同時接続対応\r
+//     hTransferThread = (HANDLE)_beginthreadex(NULL, 0, TransferThread, 0, 0, &dwID);\r
+//     if (hTransferThread == NULL)\r
+//             return(FFFTP_FAIL); /* XXX */\r
+       for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
+       {\r
+               hTransferThread[i] = (HANDLE)_beginthreadex(NULL, 0, TransferThread, (void*)i, 0, &dwID);\r
+               if(hTransferThread[i] == NULL)\r
+                       return FFFTP_FAIL;\r
+       }\r
 \r
        return(FFFTP_SUCCESS);\r
 }\r
@@ -184,17 +201,31 @@ int MakeTransferThread(void)
 \r
 void CloseTransferThread(void)\r
 {\r
-       Canceled = YES;\r
+       int i;\r
+       // 同時接続対応\r
+//     Canceled = YES;\r
+       for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
+               Canceled[i] = YES;\r
        ClearAll = YES;\r
        ForceAbort = YES;\r
 \r
        fTransferThreadExit = TRUE;\r
-       while(WaitForSingleObject(hTransferThread, 10) == WAIT_TIMEOUT)\r
+       // 同時接続対応\r
+//     while(WaitForSingleObject(hTransferThread, 10) == WAIT_TIMEOUT)\r
+//     {\r
+//             BackgrndMessageProc();\r
+//             Canceled = YES;\r
+//     }\r
+//     CloseHandle(hTransferThread);\r
+       for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
        {\r
-               BackgrndMessageProc();\r
-               Canceled = YES;\r
+               while(WaitForSingleObject(hTransferThread[i], 10) == WAIT_TIMEOUT)\r
+               {\r
+                       BackgrndMessageProc();\r
+                       Canceled[i] = YES;\r
+               }\r
+               CloseHandle(hTransferThread[i]);\r
        }\r
-       CloseHandle(hTransferThread);\r
 \r
        ReleaseMutex( hRunMutex );\r
 \r
@@ -565,12 +596,24 @@ static ULONG WINAPI TransferThread(void *Dummy)
        int Down;\r
        int Up;\r
        int DelNotify;\r
+       int ThreadCount;\r
+       SOCKET CmdSkt;\r
+       SOCKET NewCmdSkt;\r
+       SOCKET TrnSkt;\r
+       RECT WndRect;\r
+       int i;\r
 \r
        hWndTrans = NULL;\r
        Down = NO;\r
        Up = NO;\r
        GoExit = NO;\r
        DelNotify = NO;\r
+       // 同時接続対応\r
+       // ソケットは各転送スレッドが管理\r
+       ThreadCount = (int)Dummy;\r
+       CmdSkt = INVALID_SOCKET;\r
+       NewCmdSkt = INVALID_SOCKET;\r
+       TrnSkt = INVALID_SOCKET;\r
 \r
        while((TransPacketBase != NULL) ||\r
                  (WaitForSingleObject(hRunMutex, 200) == WAIT_TIMEOUT))\r
@@ -581,26 +624,62 @@ static ULONG WINAPI TransferThread(void *Dummy)
                WaitForSingleObject(hListAccMutex, INFINITE);\r
                memset(ErrMsg, NUL, ERR_MSG_LEN+7);\r
 \r
-               Canceled = NO;\r
+//             Canceled = NO;\r
+               Canceled[ThreadCount] = NO;\r
 \r
-               if(TransPacketBase != NULL)\r
+               NewCmdSkt = AskCmdCtrlSkt();\r
+               if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
                {\r
-                       ReleaseMutex(hListAccMutex);\r
+                       if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
+                       {\r
+                               ReleaseMutex(hListAccMutex);\r
+                               ReConnectTrnSkt(&TrnSkt);\r
+                               WaitForSingleObject(hListAccMutex, INFINITE);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(TrnSkt != INVALID_SOCKET)\r
+                       {\r
+                               ReleaseMutex(hListAccMutex);\r
+                               DoClose(TrnSkt);\r
+                               TrnSkt = INVALID_SOCKET;\r
+                               WaitForSingleObject(hListAccMutex, INFINITE);\r
+                       }\r
+               }\r
+               CmdSkt = NewCmdSkt;\r
+//             if(TransPacketBase != NULL)\r
+               if(TrnSkt != INVALID_SOCKET && TransPacketBase != NULL)\r
+               {\r
+                       Pos = TransPacketBase;\r
+                       TransPacketBase = TransPacketBase->Next;\r
+                       // ディレクトリ操作は非同期で行わない\r
+//                     ReleaseMutex(hListAccMutex);\r
                        if(hWndTrans == NULL)\r
                        {\r
-                               if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) ||\r
-                                  (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) ||\r
-                                  (strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) ||\r
-                                  (strncmp(TransPacketBase->Cmd, "L-", 2) == 0) ||\r
-                                  (strncmp(TransPacketBase->Cmd, "R-", 2) == 0))\r
+//                             if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) ||\r
+//                                (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) ||\r
+//                                (strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) ||\r
+//                                (strncmp(TransPacketBase->Cmd, "L-", 2) == 0) ||\r
+//                                (strncmp(TransPacketBase->Cmd, "R-", 2) == 0))\r
+                               if((strncmp(Pos->Cmd, "RETR", 4) == 0) ||\r
+                                  (strncmp(Pos->Cmd, "STOR", 4) == 0) ||\r
+                                  (strncmp(Pos->Cmd, "MKD", 3) == 0) ||\r
+                                  (strncmp(Pos->Cmd, "L-", 2) == 0) ||\r
+                                  (strncmp(Pos->Cmd, "R-", 2) == 0))\r
                                {\r
                                        hWndTrans = CreateDialog(GetFtpInst(), MAKEINTRESOURCE(transfer_dlg), HWND_DESKTOP, (DLGPROC)TransDlgProc);\r
                                        if(MoveToForeground == YES)\r
                                                SetForegroundWindow(hWndTrans);\r
                                        ShowWindow(hWndTrans, SW_SHOWNOACTIVATE);\r
+                                       GetWindowRect(hWndTrans, &WndRect);\r
+                                       SetWindowPos(hWndTrans, NULL, WndRect.left, WndRect.top + (WndRect.bottom - WndRect.top) * ThreadCount - (WndRect.bottom - WndRect.top) * (AskMaxThreadCount() - 1) / 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER);\r
                                }\r
                        }\r
-                       TransPacketBase->hWndTrans = hWndTrans;\r
+//                     TransPacketBase->hWndTrans = hWndTrans;\r
+                       Pos->hWndTrans = hWndTrans;\r
+                       Pos->ctrl_skt = TrnSkt;\r
+                       Pos->ThreadCount = ThreadCount;\r
 \r
                        if(hWndTrans != NULL)\r
                        {\r
@@ -612,60 +691,85 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        }\r
 \r
                        if(hWndTrans != NULL)\r
-                               SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase);\r
+//                             SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase);\r
+                               SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)Pos);\r
 \r
                        /* ダウンロード */\r
-                       if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0)\r
+//                     if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0)\r
+                       if(strncmp(Pos->Cmd, "RETR", 4) == 0)\r
                        {\r
+                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+//                             ReleaseMutex(hListAccMutex);\r
                                /* 不正なパスを検出 */\r
-                               if(CheckPathViolation(TransPacketBase) == NO)\r
+//                             if(CheckPathViolation(TransPacketBase) == NO)\r
+                               if(CheckPathViolation(Pos) == NO)\r
                                {\r
                                        /* フルパスを使わないための処理 */\r
-                                       if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+//                                     if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+                                       if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS)\r
                                        {\r
-                                               if(strncmp(TransPacketBase->Cmd, "RETR-S", 6) == 0)\r
+//                                             if(strncmp(TransPacketBase->Cmd, "RETR-S", 6) == 0)\r
+                                               if(strncmp(Pos->Cmd, "RETR-S", 6) == 0)\r
                                                {\r
                                                        /* サイズと日付を取得 */\r
-                                                       DoSIZE(TransPacketBase->RemoteFile, &TransPacketBase->Size);\r
-                                                       DoMDTM(TransPacketBase->RemoteFile, &TransPacketBase->Time);\r
-                                                       strcpy(TransPacketBase->Cmd, "RETR ");\r
+//                                                     DoSIZE(TransPacketBase->RemoteFile, &TransPacketBase->Size);\r
+//                                                     DoMDTM(TransPacketBase->RemoteFile, &TransPacketBase->Time);\r
+//                                                     strcpy(TransPacketBase->Cmd, "RETR ");\r
+                                                       DoSIZE(TrnSkt, Pos->RemoteFile, &Pos->Size);\r
+                                                       DoMDTM(TrnSkt, Pos->RemoteFile, &Pos->Time);\r
+                                                       strcpy(Pos->Cmd, "RETR ");\r
                                                }\r
 \r
                                                Down = YES;\r
 //                                             if(DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO) == 429)\r
 //                                             {\r
 //                                                     if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-                                                               DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
+//                                                             DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
+                                                               DoDownLoad(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]);\r
 //                                             }\r
                                        }\r
                                }\r
+                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* アップロード */\r
-                       else if(strncmp(TransPacketBase->Cmd, "STOR", 4) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "STOR", 4) == 0)\r
+                       else if(strncmp(Pos->Cmd, "STOR", 4) == 0)\r
                        {\r
+                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+//                             ReleaseMutex(hListAccMutex);\r
                                /* フルパスを使わないための処理 */\r
-                               if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+//                             if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+                               if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS)\r
                                {\r
                                        Up = YES;\r
 //                                     if(DoUpLoad(AskTrnCtrlSkt(), TransPacketBase) == 429)\r
 //                                     {\r
 //                                             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-                                                       DoUpLoad(AskTrnCtrlSkt(), TransPacketBase);\r
+//                                                     DoUpLoad(AskTrnCtrlSkt(), TransPacketBase);\r
+                                                       DoUpLoad(TrnSkt, Pos);\r
 //                                     }\r
                                }\r
+                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* フォルダ作成(ローカルまたはホスト) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "MKD", 3) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "MKD", 3) == 0)\r
+                       else if(strncmp(Pos->Cmd, "MKD", 3) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN078, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN078, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN078, FALSE, YES);\r
 \r
-                               if(strlen(TransPacketBase->RemoteFile) > 0)\r
+//                             if(strlen(TransPacketBase->RemoteFile) > 0)\r
+                               if(strlen(Pos->RemoteFile) > 0)\r
                                {\r
                                        /* フルパスを使わないための処理 */\r
                                        CwdSts = FTP_COMPLETE;\r
 \r
-                                       strcpy(Tmp, TransPacketBase->RemoteFile);\r
-                                       if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, 1) == FFFTP_FAIL)\r
+//                                     strcpy(Tmp, TransPacketBase->RemoteFile);\r
+                                       strcpy(Tmp, Pos->RemoteFile);\r
+//                                     if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, 1) == FFFTP_FAIL)\r
+                                       if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, (int)TrnSkt + 1) == FFFTP_FAIL)\r
                                        {\r
                                                ClearAll = YES;\r
                                                CwdSts = FTP_ERROR;\r
@@ -674,130 +778,181 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                        if(CwdSts == FTP_COMPLETE)\r
                                        {\r
                                                Up = YES;\r
-                                               CommandProcTrn(NULL, "MKD %s", Tmp);\r
+//                                             CommandProcTrn(NULL, "MKD %s", Tmp);\r
+                                               CommandProcTrn(TrnSkt, NULL, "MKD %s", Tmp);\r
                                                /* すでにフォルダがある場合もあるので、 */\r
                                                /* ここではエラーチェックはしない */\r
 \r
                                        if(FolderAttr)\r
-                                               CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp);\r
+//                                             CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp);\r
+                                               CommandProcTrn(TrnSkt, NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp);\r
                                        }\r
                                }\r
-                               else if(strlen(TransPacketBase->LocalFile) > 0)\r
+//                             else if(strlen(TransPacketBase->LocalFile) > 0)\r
+                               else if(strlen(Pos->LocalFile) > 0)\r
                                {\r
                                        Down = YES;\r
-                                       DoLocalMKD(TransPacketBase->LocalFile);\r
+//                                     DoLocalMKD(TransPacketBase->LocalFile);\r
+                                       DoLocalMKD(Pos->LocalFile);\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* ディレクトリ作成(常にホスト側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "R-MKD", 5) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "R-MKD", 5) == 0)\r
+                       else if(strncmp(Pos->Cmd, "R-MKD", 5) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN079, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN079, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN079, FALSE, YES);\r
 \r
                                /* フルパスを使わないための処理 */\r
-                               if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+//                             if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+                               if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS)\r
                                {\r
                                        Up = YES;\r
-                                       CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+//                                     CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+                                       CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile);\r
 \r
                                        if(FolderAttr)\r
-                                               CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, TransPacketBase->RemoteFile);\r
+//                                             CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, TransPacketBase->RemoteFile);\r
+                                               CommandProcTrn(TrnSkt, NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Pos->RemoteFile);\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* ディレクトリ削除(常にホスト側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "R-RMD", 5) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "R-RMD", 5) == 0)\r
+                       else if(strncmp(Pos->Cmd, "R-RMD", 5) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN080, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN080, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN080, FALSE, YES);\r
 \r
-                               DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase);\r
+//                             DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase);\r
+                               DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, Pos);\r
                                if((DelNotify == YES) || (DelNotify == YES_ALL))\r
                                {\r
                                        /* フルパスを使わないための処理 */\r
-                                       if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+//                                     if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+                                       if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS)\r
                                        {\r
                                                Up = YES;\r
-                                               CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+//                                             CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+                                               CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile);\r
                                        }\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* ファイル削除(常にホスト側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "R-DELE", 6) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "R-DELE", 6) == 0)\r
+                       else if(strncmp(Pos->Cmd, "R-DELE", 6) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN081, FALSE, YES);\r
+                               ReleaseMutex(hListAccMutex);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN081, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN081, FALSE, YES);\r
 \r
-                               DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase);\r
+//                             DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase);\r
+                               DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, Pos);\r
                                if((DelNotify == YES) || (DelNotify == YES_ALL))\r
                                {\r
                                        /* フルパスを使わないための処理 */\r
-                                       if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+//                                     if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS)\r
+                                       if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS)\r
                                        {\r
                                                Up = YES;\r
-                                               CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+//                                             CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile);\r
+                                               CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile);\r
                                        }\r
                                }\r
                        }\r
                        /* ディレクトリ作成(常にローカル側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "L-MKD", 5) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "L-MKD", 5) == 0)\r
+                       else if(strncmp(Pos->Cmd, "L-MKD", 5) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN082, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN082, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN082, FALSE, YES);\r
 \r
                                Down = YES;\r
-                               DoLocalMKD(TransPacketBase->LocalFile);\r
+//                             DoLocalMKD(TransPacketBase->LocalFile);\r
+                               DoLocalMKD(Pos->LocalFile);\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* ディレクトリ削除(常にローカル側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "L-RMD", 5) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "L-RMD", 5) == 0)\r
+                       else if(strncmp(Pos->Cmd, "L-RMD", 5) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN083, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN083, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN083, FALSE, YES);\r
 \r
-                               DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase);\r
+//                             DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase);\r
+                               DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, Pos);\r
                                if((DelNotify == YES) || (DelNotify == YES_ALL))\r
                                {\r
                                        Down = YES;\r
-                                       DoLocalRMD(TransPacketBase->LocalFile);\r
+//                                     DoLocalRMD(TransPacketBase->LocalFile);\r
+                                       DoLocalRMD(Pos->LocalFile);\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* ファイル削除(常にローカル側) */\r
-                       else if(strncmp(TransPacketBase->Cmd, "L-DELE", 6) == 0)\r
+//                     else if(strncmp(TransPacketBase->Cmd, "L-DELE", 6) == 0)\r
+                       else if(strncmp(Pos->Cmd, "L-DELE", 6) == 0)\r
                        {\r
-                               DispTransFileInfo(TransPacketBase, MSGJPN084, FALSE, YES);\r
+//                             DispTransFileInfo(TransPacketBase, MSGJPN084, FALSE, YES);\r
+                               DispTransFileInfo(Pos, MSGJPN084, FALSE, YES);\r
 \r
-                               DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase);\r
+//                             DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase);\r
+                               DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, Pos);\r
                                if((DelNotify == YES) || (DelNotify == YES_ALL))\r
                                {\r
                                        Down = YES;\r
-                                       DoLocalDELE(TransPacketBase->LocalFile);\r
+//                                     DoLocalDELE(TransPacketBase->LocalFile);\r
+                                       DoLocalDELE(Pos->LocalFile);\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* カレントディレクトリを設定 */\r
-                       else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0)\r
+//                     else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0)\r
+                       else if(strcmp(Pos->Cmd, "SETCUR") == 0)\r
                        {\r
                                if(AskShareProh() == YES)\r
                                {\r
-                                       if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
+//                                     if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
+                                       if(strcmp(CurDir, Pos->RemoteFile) != 0)\r
                                        {\r
-                                               if(CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile)/100 != FTP_COMPLETE)\r
+//                                             if(CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile)/100 != FTP_COMPLETE)\r
+                                               if(CommandProcTrn(TrnSkt, NULL, "CWD %s", Pos->RemoteFile)/100 != FTP_COMPLETE)\r
                                                {\r
                                                        DispCWDerror(hWndTrans);\r
                                                        ClearAll = YES;\r
                                                }\r
                                        }\r
                                }\r
-                               strcpy(CurDir, TransPacketBase->RemoteFile);\r
+//                             strcpy(CurDir, TransPacketBase->RemoteFile);\r
+                               strcpy(CurDir, Pos->RemoteFile);\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* カレントディレクトリを戻す */\r
-                       else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0)\r
+//                     else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0)\r
+                       else if(strcmp(Pos->Cmd, "BACKCUR") == 0)\r
                        {\r
                                if(AskShareProh() == NO)\r
                                {\r
-                                       if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
-                                               CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile);\r
-                                       strcpy(CurDir, TransPacketBase->RemoteFile);\r
+//                                     if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
+//                                             CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile);\r
+//                                     strcpy(CurDir, TransPacketBase->RemoteFile);\r
+                                       if(strcmp(CurDir, Pos->RemoteFile) != 0)\r
+                                               CommandProcTrn(TrnSkt, NULL, "CWD %s", Pos->RemoteFile);\r
+                                       strcpy(CurDir, Pos->RemoteFile);\r
                                }\r
+                               ReleaseMutex(hListAccMutex);\r
                        }\r
                        /* 自動終了のための通知 */\r
-                       else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0)\r
+//                     else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0)\r
+                       else if(strcmp(Pos->Cmd, "GOQUIT") == 0)\r
                        {\r
+                               ReleaseMutex(hListAccMutex);\r
                                GoExit = YES;\r
                        }\r
+                       else\r
+                               ReleaseMutex(hListAccMutex);\r
 \r
                        /*===== 1つの処理終わり =====*/\r
 \r
@@ -805,18 +960,27 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        {\r
                                WaitForSingleObject(hListAccMutex, INFINITE);\r
                                if(ClearAll == YES)\r
+//                                     EraseTransFileList();\r
+                               {\r
+                                       for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
+                                               Canceled[i] = YES;\r
                                        EraseTransFileList();\r
+                               }\r
                                else\r
                                {\r
-                                       if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) ||\r
-                                          (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0))\r
+//                                     if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) ||\r
+//                                        (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0))\r
+                                       if((strncmp(Pos->Cmd, "RETR", 4) == 0) ||\r
+                                          (strncmp(Pos->Cmd, "STOR", 4) == 0))\r
                                        {\r
-                                               TransFiles--;\r
+//                                             TransFiles--;\r
+                                               if(TransFiles > 0)\r
+                                                       TransFiles--;\r
                                                PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
                                        }\r
-                                       Pos = TransPacketBase;\r
-                                       TransPacketBase = TransPacketBase->Next;\r
-                                       free(Pos);\r
+//                                     Pos = TransPacketBase;\r
+//                                     TransPacketBase = TransPacketBase->Next;\r
+//                                     free(Pos);\r
                                }\r
                                ClearAll = NO;\r
                                ReleaseMutex(hListAccMutex);\r
@@ -828,8 +992,12 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                        ReleaseMutex(hListAccMutex);\r
                                }\r
                        }\r
+                       if(hWndTrans != NULL)\r
+                               SendMessage(hWndTrans, WM_SET_PACKET, 0, 0);\r
+                       free(Pos);\r
                }\r
-               else\r
+//             else\r
+               else if(TransPacketBase == NULL)\r
                {\r
                        DelNotify = NO;\r
 \r
@@ -858,6 +1026,7 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                }\r
                        }\r
                        BackgrndMessageProc();\r
+                       Sleep(1);\r
 \r
                        if(GoExit == YES)\r
                        {\r
@@ -865,7 +1034,20 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                GoExit = NO;\r
                        }\r
                }\r
+               else\r
+               {\r
+                       ReleaseMutex(hListAccMutex);\r
+                       if(hWndTrans != NULL)\r
+                       {\r
+                               DestroyWindow(hWndTrans);\r
+                               hWndTrans = NULL;\r
+                       }\r
+                       BackgrndMessageProc();\r
+                       Sleep(1);\r
+               }\r
        }\r
+       if(TrnSkt != INVALID_SOCKET)\r
+               DoClose(TrnSkt);\r
        return 0;\r
 }\r
 \r
@@ -886,11 +1068,13 @@ static ULONG WINAPI TransferThread(void *Dummy)
 *                      Pkt->RemoteFile にファイル名のみ残す。(パス名は消す)\r
 *----------------------------------------------------------------------------*/\r
 \r
+// 同時接続対応\r
 static int MakeNonFullPath(TRANSPACKET *Pkt, char *Cur, char *Tmp)\r
 {\r
        int Sts;\r
 \r
-       Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, 1);\r
+//     Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, 1);\r
+       Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, (int)Pkt->ctrl_skt + 1);\r
        if(Sts == FFFTP_FAIL)\r
                ClearAll = YES;\r
 \r
@@ -937,7 +1121,9 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
                {\r
                        if(Pkt->hWndTrans != NULL)\r
                        {\r
-                               AllTransSizeNow = 0;\r
+                               // 同時接続対応\r
+//                             AllTransSizeNow = 0;\r
+                               AllTransSizeNow[Pkt->ThreadCount] = 0;\r
 \r
                                if(DirList == NO)\r
                                        DispTransFileInfo(Pkt, MSGJPN086, TRUE, YES);\r
@@ -1017,6 +1203,8 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 \r
                                if(data_socket != INVALID_SOCKET)\r
                                {\r
+                                       // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                                       ReleaseMutex(hListAccMutex);\r
                                        // FTPS対応\r
 //                                     iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                        if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
@@ -1091,6 +1279,8 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                                        iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "%s", Buf);\r
                                        if(iRetCode/100 == FTP_PRELIM)\r
                                        {\r
+                                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                                               ReleaseMutex(hListAccMutex);\r
                                                // FTPS対応\r
 //                                             iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                                if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
@@ -1209,7 +1399,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc
 \r
                if(Pkt->hWndTrans != NULL)\r
                {\r
-                       TimeStart = time(NULL);\r
+                       // 同時接続対応\r
+//                     TimeStart = time(NULL);\r
+                       TimeStart[Pkt->ThreadCount] = time(NULL);\r
                        SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL);\r
                }\r
 \r
@@ -1482,7 +1674,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc
 \r
                        Pkt->ExistSize += iNumBytes;\r
                        if(Pkt->hWndTrans != NULL)\r
-                               AllTransSizeNow += iNumBytes;\r
+                               // 同時接続対応\r
+//                             AllTransSizeNow += iNumBytes;\r
+                               AllTransSizeNow[Pkt->ThreadCount] += iNumBytes;\r
                        else\r
                        {\r
                                /* 転送ダイアログを出さない時の経過表示 */\r
@@ -1631,7 +1825,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc
                {\r
                        KillTimer(Pkt->hWndTrans, TIMER_DISPLAY);\r
                        DispTransferStatus(Pkt->hWndTrans, YES, Pkt);\r
-                       TimeStart = time(NULL) - TimeStart + 1;\r
+                       // 同時接続対応\r
+//                     TimeStart = time(NULL) - TimeStart + 1;\r
+                       TimeStart[Pkt->ThreadCount] = time(NULL) - TimeStart[Pkt->ThreadCount] + 1;\r
                }\r
                else\r
                {\r
@@ -1726,14 +1922,19 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                SetTaskMsg(MSGJPN097);\r
                                strcpy(Fname, MSGJPN098);\r
                        }\r
-                       else if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
-                               SetTaskMsg(MSGJPN099, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       // 同時接続対応\r
+//                     else if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
+//                             SetTaskMsg(MSGJPN099, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       else if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0))\r
+                               SetTaskMsg(MSGJPN099, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]);\r
                        else\r
                                SetTaskMsg(MSGJPN100);\r
 \r
                        if(Pkt->Abort != ABORT_USER)\r
                        {\r
-                               if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
+                               // 全て中止を選択後にダイアログが表示されるバグ対策\r
+//                             if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
+                               if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
                                        ClearAll = YES;\r
                        }\r
                }\r
@@ -1741,8 +1942,11 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                {\r
                        if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
                                SetTaskMsg(MSGJPN101, Pkt->ExistSize);\r
-                       else if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
-                               SetTaskMsg(MSGJPN102, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       // 同時接続対応\r
+//                     else if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
+//                             SetTaskMsg(MSGJPN102, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       else if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0))\r
+                               SetTaskMsg(MSGJPN102, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]);\r
                        else\r
                                SetTaskMsg(MSGJPN103, Pkt->ExistSize);\r
                }\r
@@ -1927,7 +2131,9 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                        if(Pkt->Type == TYPE_I)\r
                                Pkt->KanjiCode = KANJI_NOCNV;\r
 \r
-                       iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "TYPE %c", Pkt->Type);\r
+                       // 同時接続対応\r
+//                     iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "TYPE %c", Pkt->Type);\r
+                       iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "TYPE %c", Pkt->Type);\r
                        if(iRetCode/100 < FTP_RETRY)\r
                        {\r
                                if(Pkt->Mode == EXIST_UNIQUE)\r
@@ -1951,7 +2157,9 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
 \r
                        /* 属性変更 */\r
                        if((Pkt->Attr != -1) && ((iRetCode/100) == FTP_COMPLETE))\r
-                               command(Pkt->ctrl_skt, Reply, &Canceled, "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile);\r
+                               // 同時接続対応\r
+//                             command(Pkt->ctrl_skt, Reply, &Canceled, "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile);\r
+                               command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile);\r
                }\r
                else\r
                {\r
@@ -1992,7 +2200,9 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
        int Resume;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
-       if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled)) != INVALID_SOCKET)\r
+       // 同時接続対応\r
+//     if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled)) != INVALID_SOCKET)\r
+       if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount])) != INVALID_SOCKET)\r
        {\r
                SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);\r
                if(Resume == NO)\r
@@ -2000,7 +2210,9 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                else\r
                        sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
 \r
-               iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf);\r
+               // 同時接続対応\r
+//             iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf);\r
+               iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf);\r
                if((iRetCode/100) == FTP_PRELIM)\r
                {\r
                        if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL)\r
@@ -2024,6 +2236,8 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
 \r
                        if(data_socket != INVALID_SOCKET)\r
                        {\r
+                               // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                               ReleaseMutex(hListAccMutex);\r
                                // FTPS対応\r
 //                             iRetCode = UpLoadFile(Pkt, data_socket);\r
                                if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
@@ -2077,12 +2291,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
        int Resume;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
-       iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV");\r
+       // 同時接続対応\r
+//     iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV");\r
+       iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV");\r
        if(iRetCode/100 == FTP_COMPLETE)\r
        {\r
                if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS)\r
                {\r
-                       if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET)\r
+                       // 同時接続対応\r
+//                     if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET)\r
+                       if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled[Pkt->ThreadCount])) != INVALID_SOCKET)\r
                        {\r
                                // 変数が未初期化のバグ修正\r
                                Flg = 1;\r
@@ -2095,9 +2313,13 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
                                else\r
                                        sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
 \r
-                               iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf);\r
+                               // 同時接続対応\r
+//                             iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf);\r
+                               iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf);\r
                                if(iRetCode/100 == FTP_PRELIM)\r
                                {\r
+                                       // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
+                                       ReleaseMutex(hListAccMutex);\r
                                        // FTPS対応\r
 //                                     iRetCode = UpLoadFile(Pkt, data_socket);\r
                                        if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
@@ -2212,8 +2434,11 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                        Low = (DWORD)LOW32(Pkt->ExistSize);\r
                        SetFilePointer(iFileHandle, Low, &High, FILE_BEGIN);\r
 \r
-                       AllTransSizeNow = 0;\r
-                       TimeStart = time(NULL);\r
+                       // 同時接続対応\r
+//                     AllTransSizeNow = 0;\r
+//                     TimeStart = time(NULL);\r
+                       AllTransSizeNow[Pkt->ThreadCount] = 0;\r
+                       TimeStart[Pkt->ThreadCount] = time(NULL);\r
                        SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL);\r
                }\r
 \r
@@ -2442,7 +2667,7 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                                        }\r
 \r
 //                                     if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FFFTP_FAIL)\r
-                                       if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
+                                       if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
                                        {\r
                                                Pkt->Abort = ABORT_ERROR;\r
                                                        break;\r
@@ -2452,13 +2677,17 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                        }\r
                        else\r
                        {\r
-                               if(TermCodeConvAndSend(&tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL)\r
+                               // 同時接続対応\r
+//                             if(TermCodeConvAndSend(&tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL)\r
+                               if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL)\r
                                        Pkt->Abort = ABORT_ERROR;\r
                        }\r
 \r
                        Pkt->ExistSize += iNumBytes;\r
                        if(Pkt->hWndTrans != NULL)\r
-                               AllTransSizeNow += iNumBytes;\r
+                               // 同時接続対応\r
+//                             AllTransSizeNow += iNumBytes;\r
+                               AllTransSizeNow[Pkt->ThreadCount] += iNumBytes;\r
 \r
                        if(BackgrndMessageProc() == YES)\r
                                ForceAbort = YES;\r
@@ -2594,19 +2823,21 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                                }\r
 \r
 //                             if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FFFTP_FAIL)\r
-                               if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
+                               if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
                                        Pkt->Abort = ABORT_ERROR;\r
                                cInfo2.Buf = Buf3;\r
                                cInfo2.BufSize = (BUFSIZE + 3) * 4;\r
                                FlushRestData(&cInfo2);\r
-                               if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
+                               if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL)\r
                                        Pkt->Abort = ABORT_ERROR;\r
                        }\r
 \r
                        tInfo.Buf = Buf2;\r
                        tInfo.BufSize = BUFSIZE+3;\r
                        FlushRestTermCodeConvData(&tInfo);\r
-                       if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled) == FFFTP_FAIL)\r
+                       // 同時接続対応\r
+//                     if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled) == FFFTP_FAIL)\r
+                       if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL)\r
                                Pkt->Abort = ABORT_ERROR;\r
                }\r
 \r
@@ -2615,7 +2846,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                {\r
                        KillTimer(Pkt->hWndTrans, TIMER_DISPLAY);\r
                        DispTransferStatus(Pkt->hWndTrans, YES, Pkt);\r
-                       TimeStart = time(NULL) - TimeStart + 1;\r
+                       // 同時接続対応\r
+//                     TimeStart = time(NULL) - TimeStart + 1;\r
+                       TimeStart[Pkt->ThreadCount] = time(NULL) - TimeStart[Pkt->ThreadCount] + 1;\r
                }\r
                CloseHandle(iFileHandle);\r
        }\r
@@ -2635,7 +2868,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                ;\r
 #endif\r
 \r
-       iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled, TmpBuf);\r
+       // 同時接続対応\r
+//     iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled, TmpBuf);\r
+       iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled[Pkt->ThreadCount], TmpBuf);\r
 \r
 //#pragma aaa\r
 //DoPrintf("##UP REPLY : %s", Buf);\r
@@ -2663,7 +2898,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii)\r
+// 同時接続対応\r
+//static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii)\r
+static int TermCodeConvAndSend(int ThreadCount, TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii)\r
 {\r
        char Buf3[BUFSIZE*2];\r
        int Continue;\r
@@ -2681,13 +2918,17 @@ static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data,
                do\r
                {\r
                        Continue = ConvTermCodeToCRLF(tInfo);\r
-                       if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled)) == FFFTP_FAIL)\r
+                       // 同時接続対応\r
+//                     if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled)) == FFFTP_FAIL)\r
+                       if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled[ThreadCount])) == FFFTP_FAIL)\r
                                break;\r
                }\r
                while(Continue == YES);\r
        }\r
        else\r
-               Ret = SendData(Skt, Data, Size, 0, &Canceled);\r
+               // 同時接続対応\r
+//             Ret = SendData(Skt, Data, Size, 0, &Canceled);\r
+               Ret = SendData(Skt, Data, Size, 0, &Canceled[ThreadCount]);\r
 \r
        return(Ret);\r
 }\r
@@ -2709,21 +2950,29 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
        {\r
                if((iRetCode/100) >= FTP_CONTINUE)\r
                {\r
-                       if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
-                               SetTaskMsg(MSGJPN113, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       // 同時接続対応\r
+//                     if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
+//                             SetTaskMsg(MSGJPN113, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0))\r
+                               SetTaskMsg(MSGJPN113, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]);\r
                        else\r
                                SetTaskMsg(MSGJPN114);\r
 \r
                        if(Pkt->Abort != ABORT_USER)\r
                        {\r
-                               if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
+                               // 全て中止を選択後にダイアログが表示されるバグ対策\r
+//                             if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
+                               if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
                                        ClearAll = YES;\r
                        }\r
                }\r
                else\r
                {\r
-                       if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
-                               SetTaskMsg(MSGJPN115, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       // 同時接続対応\r
+//                     if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
+//                             SetTaskMsg(MSGJPN115, TimeStart, Pkt->ExistSize/TimeStart);\r
+                       if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0))\r
+                               SetTaskMsg(MSGJPN115, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]);\r
                        else\r
                                SetTaskMsg(MSGJPN116);\r
                }\r
@@ -2780,7 +3029,10 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM
        RECT RectDlg;\r
        RECT RectPar;\r
        HMENU hMenu;\r
-       static TRANSPACKET *Pkt;\r
+       // 同時接続対応\r
+//     static TRANSPACKET *Pkt;\r
+       TRANSPACKET *Pkt;\r
+       int i;\r
 \r
        switch(Msg)\r
        {\r
@@ -2809,11 +3061,16 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM
 \r
                                case TRANS_STOP_ALL :\r
                                        ClearAll = YES;\r
+                                       for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
+                                               Canceled[i] = YES;\r
                                        /* ここに break はない */\r
 \r
                                case IDCANCEL :\r
+                                       if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
+                                               break;\r
                                        Pkt->Abort = ABORT_USER;\r
-                                       Canceled = YES;\r
+//                                     Canceled = YES;\r
+                                       Canceled[Pkt->ThreadCount] = YES;\r
                                        break;\r
                        }\r
                        break;\r
@@ -2825,13 +3082,18 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM
                                        SetForegroundWindow(hDlg);\r
                                MoveToForeground = NO;\r
                                KillTimer(hDlg, TIMER_DISPLAY);\r
+                               if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
+                                       break;\r
+                               if(Canceled[Pkt->ThreadCount] == YES)\r
+                                       Pkt->Abort = ABORT_USER;\r
                                DispTransferStatus(hDlg, NO, Pkt);\r
                                SetTimer(hDlg, TIMER_DISPLAY, DISPLAY_TIMING, NULL);\r
                        }\r
                        break;\r
 \r
                case WM_SET_PACKET :\r
-                       Pkt = (TRANSPACKET *)lParam;\r
+//                     Pkt = (TRANSPACKET *)lParam;\r
+                       SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam);\r
                        break;\r
        }\r
        return(FALSE);\r
@@ -2874,11 +3136,15 @@ static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt)
                {\r
                        if(End == NO)\r
                        {\r
-                               TotalLap = time(NULL) - TimeStart + 1;\r
+                               // 同時接続対応\r
+//                             TotalLap = time(NULL) - TimeStart + 1;\r
+                               TotalLap = time(NULL) - TimeStart[Pkt->ThreadCount] + 1;\r
 \r
                                Bps = 0;\r
                                if(TotalLap != 0)\r
-                                       Bps = AllTransSizeNow / TotalLap;\r
+                                       // 同時接続対応\r
+//                                     Bps = AllTransSizeNow / TotalLap;\r
+                                       Bps = AllTransSizeNow[Pkt->ThreadCount] / TotalLap;\r
                                Transed = Pkt->Size - Pkt->ExistSize;\r
 \r
                                if(Pkt->Size <= 0)\r
index 0d69cfe..a2aec84 100644 (file)
--- a/history.c
+++ b/history.c
@@ -227,6 +227,8 @@ static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New)
        New->UseFTPES = Host->UseFTPES;\r
        New->UseFTPIS = Host->UseFTPIS;\r
        New->UseSFTP = Host->UseSFTP;\r
+       // 同時接続対応\r
+       New->MaxThreadCount = Host->MaxThreadCount;\r
        return;\r
 }\r
 \r
@@ -280,6 +282,8 @@ void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host)
        Host->UseFTPES = Hist->UseFTPES;\r
        Host->UseFTPIS = Hist->UseFTPIS;\r
        Host->UseSFTP = Hist->UseSFTP;\r
+       // 同時接続対応\r
+       Host->MaxThreadCount = Hist->MaxThreadCount;\r
        return;\r
 }\r
 \r
index 8b590b9..ce20c43 100644 (file)
--- a/hostman.c
+++ b/hostman.c
@@ -69,6 +69,8 @@ static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam,
 static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 // 暗号化通信対応\r
 static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 同時接続対応\r
+static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 \r
 /*===== 外部参照 =====*/\r
 \r
@@ -1025,6 +1027,8 @@ int CopyHostFromListInConnect(int Num, HOSTDATA *Set)
                Set->UseFTPES = Pos->Set.UseFTPES;\r
                Set->UseFTPIS = Pos->Set.UseFTPIS;\r
                Set->UseSFTP = Pos->Set.UseSFTP;\r
+               // 同時接続対応\r
+               Set->MaxThreadCount = Pos->Set.MaxThreadCount;\r
                Sts = FFFTP_SUCCESS;\r
        }\r
        return(Sts);\r
@@ -1303,6 +1307,8 @@ void CopyDefaultHost(HOSTDATA *Set)
        Set->UseFTPES = YES;\r
        Set->UseFTPIS = YES;\r
        Set->UseSFTP = YES;\r
+       // 同時接続対応\r
+       Set->MaxThreadCount = 1;\r
        return;\r
 }\r
 \r
@@ -1514,9 +1520,10 @@ void ImportFromWSFTP(void)
 \r
 static int DispHostSetDlg(HWND hDlg)\r
 {\r
-// SFTP、FTPES、FTPIS対応\r
+       // SFTP、FTPES、FTPIS対応\r
+       // 同時接続対応\r
 //     PROPSHEETPAGE psp[5];\r
-       PROPSHEETPAGE psp[6];\r
+       PROPSHEETPAGE psp[7];\r
        PROPSHEETHEADER psh;\r
 \r
        psp[0].dwSize = sizeof(PROPSHEETPAGE);\r
@@ -1569,7 +1576,7 @@ static int DispHostSetDlg(HWND hDlg)
        psp[4].lParam = 0;\r
        psp[4].pfnCallback = NULL;\r
 \r
-// SFTP、FTPES、FTPIS対応\r
+       // SFTP、FTPES、FTPIS対応\r
        psp[5].dwSize = sizeof(PROPSHEETPAGE);\r
        psp[5].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
        psp[5].hInstance = GetFtpInst();\r
@@ -1580,6 +1587,17 @@ static int DispHostSetDlg(HWND hDlg)
        psp[5].lParam = 0;\r
        psp[5].pfnCallback = NULL;\r
 \r
+       // 同時接続対応\r
+       psp[6].dwSize = sizeof(PROPSHEETPAGE);\r
+       psp[6].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
+       psp[6].hInstance = GetFtpInst();\r
+       psp[6].pszTemplate = MAKEINTRESOURCE(hset_adv3_dlg);\r
+       psp[6].pszIcon = NULL;\r
+       psp[6].pfnDlgProc = Adv3SettingProc;\r
+       psp[6].pszTitle = MSGJPN320;\r
+       psp[6].lParam = 0;\r
+       psp[6].pfnCallback = NULL;\r
+\r
        psh.dwSize = sizeof(PROPSHEETHEADER);\r
        psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE;\r
        psh.hwndParent = hDlg;\r
@@ -2159,4 +2177,39 @@ static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, L
        return(FALSE);\r
 }\r
 \r
+// 同時接続対応\r
+static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       NMHDR *pnmhdr;\r
+       int Num;\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       SendDlgItemMessage(hDlg, HSET_THREAD_COUNT, EM_LIMITTEXT, (WPARAM)1, 0);\r
+                       SetDecimalText(hDlg, HSET_THREAD_COUNT, TmpHost.MaxThreadCount);\r
+                       SendDlgItemMessage(hDlg, HSET_THREAD_COUNT_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_DATA_CONNECTION, 1));\r
+                       return(TRUE);\r
+\r
+               case WM_NOTIFY:\r
+                       pnmhdr = (NMHDR FAR *)lParam;\r
+                       switch(pnmhdr->code)\r
+                       {\r
+                               case PSN_APPLY :\r
+                                       TmpHost.MaxThreadCount = GetDecimalText(hDlg, HSET_THREAD_COUNT);\r
+                                       CheckRange2(&TmpHost.MaxThreadCount, MAX_DATA_CONNECTION, 1);\r
+                                       Apply = YES;\r
+                                       break;\r
+\r
+                               case PSN_RESET :\r
+                                       break;\r
+\r
+                               case PSN_HELP :\r
+//                                     hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000066);\r
+                                       break;\r
+                       }\r
+                       break;\r
+       }\r
+       return(FALSE);\r
+}\r
 \r
diff --git a/main.c b/main.c
index 4cae7c0..d7e1244 100644 (file)
--- a/main.c
+++ b/main.c
@@ -208,6 +208,8 @@ int MirUpDelNotify = YES;
 int MirDownDelNotify = YES; \r
 int FolderAttr = NO;\r
 int FolderAttrNum = 777;\r
+// 同時接続対応\r
+int MaxThreadCount = 1;\r
 \r
 \r
 \r
index ef019e4..bd4a9a5 100644 (file)
@@ -1007,12 +1007,15 @@ START_ROUTINE
                case REG_SZ:
                case REG_EXPAND_SZ:
                case REG_MULTI_SZ:
-                       if(lpData && lpcbData)
+                       if(lpcbData)
                        {
                                pw1 = AllocateStringW(*lpcbData / sizeof(char) * 4);
                                wcbData = *lpcbData / sizeof(char) * 4;
                                r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, (LPBYTE)pw1, &wcbData);
-                               *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
+                               if(lpData)
+                                       *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
+                               else
+                                       *lpcbData = sizeof(char) * WtoM(NULL, 0, pw1, wcbData / sizeof(wchar_t));
                        }
                        break;
                default:
index 545fc84..ae18d76 100644 (file)
 #ifndef __MBSWRAPPER_H__
 #define __MBSWRAPPER_H__
 
+#include <windows.h>
+#include <shlobj.h>
+
 #ifndef DO_NOT_REPLACE
 
 #undef CreateFile
 #define CreateFile CreateFileM
+HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
 #undef MessageBox
 #define MessageBox MessageBoxM
+int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
 #undef FindFirstFile
 #define FindFirstFile FindFirstFileM
+HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
 #undef FindNextFile
 #define FindNextFile FindNextFileM
+BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
 #undef GetLogicalDriveStrings
 #define GetLogicalDriveStrings GetLogicalDriveStringsM
+DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer);
 #undef RegisterClassEx
 #define RegisterClassEx RegisterClassExM
+ATOM RegisterClassExM(CONST WNDCLASSEXA * v0);
 #undef CreateWindowEx
 #define CreateWindowEx CreateWindowExM
+HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
 #undef GetWindowLong
 #define GetWindowLong GetWindowLongM
+LONG GetWindowLongM(HWND hWnd, int nIndex);
 #undef SetWindowLong
 #define SetWindowLong SetWindowLongM
+LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong);
 #undef DefWindowProc
 #define DefWindowProc DefWindowProcM
+LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
 #undef CallWindowProc
 #define CallWindowProc CallWindowProcM
+LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
 #undef SendMessage
 #define SendMessage SendMessageM
+LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
+#undef DefDlgProc
+#define DefDlgProc DefDlgProcM
+LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
 #undef SendDlgItemMessage
 #define SendDlgItemMessage SendDlgItemMessageM
+LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam);
 #undef SetWindowText
 #define SetWindowText SetWindowTextM
+BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString);
 #undef DragQueryFile
 #define DragQueryFile DragQueryFileM
+UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch);
 #undef GetCurrentDirectory
 #define GetCurrentDirectory GetCurrentDirectoryM
+DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer);
 #undef SetCurrentDirectory
 #define SetCurrentDirectory SetCurrentDirectoryM
+BOOL SetCurrentDirectoryM(LPCSTR lpPathName);
 #undef SetDllDirectory
 #define SetDllDirectory SetDllDirectoryM
+BOOL SetDllDirectoryM(LPCSTR lpPathName);
 #undef GetTempPath
 #define GetTempPath GetTempPathM
+DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer);
 #undef GetFileAttributes
 #define GetFileAttributes GetFileAttributesM
+DWORD GetFileAttributesM(LPCSTR lpFileName);
 #undef GetModuleFileName
 #define GetModuleFileName GetModuleFileNameM
+DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize);
 #undef RegOpenKeyEx
 #define RegOpenKeyEx RegOpenKeyExM
+LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
 #undef RegCreateKeyEx
 #define RegCreateKeyEx RegCreateKeyExM
+LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
 #undef RegDeleteValue
 #define RegDeleteValue RegDeleteValueM
+LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName);
 #undef RegQueryValueEx
 #define RegQueryValueEx RegQueryValueExM
+LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
 #undef RegSetValueEx
 #define RegSetValueEx RegSetValueExM
+LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData);
 #undef TextOut
 #define TextOut TextOutM
+BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c);
 #undef GetTextExtentPoint32
 #define GetTextExtentPoint32 GetTextExtentPoint32M
+BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl);
 #undef PropertySheet
 #define PropertySheet PropertySheetM
+INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0);
 #undef GetOpenFileName
 #define GetOpenFileName GetOpenFileNameM
+BOOL GetOpenFileNameM(LPOPENFILENAMEA v0);
 #undef GetSaveFileName
 #define GetSaveFileName GetSaveFileNameM
+BOOL GetSaveFileNameM(LPOPENFILENAMEA v0);
 #undef HtmlHelp
 #define HtmlHelp HtmlHelpM
+HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);
 #undef CreateProcess
 #define CreateProcess CreateProcessM
+BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
 #undef FindExecutable
 #define FindExecutable FindExecutableM
+HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
 #undef ShellExecute
 #define ShellExecute ShellExecuteM
+HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
 #undef SHBrowseForFolder
 #define SHBrowseForFolder SHBrowseForFolderM
+PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi);
 #undef SHGetPathFromIDList
 #define SHGetPathFromIDList SHGetPathFromIDListM
+BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath);
 #undef SHFileOperation
 #define SHFileOperation SHFileOperationM
+int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp);
 #undef AppendMenu
 #define AppendMenu AppendMenuM
+BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem);
 #undef GetMenuItemInfo
 #define GetMenuItemInfo GetMenuItemInfoM
+BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii);
 #undef CreateFontIndirect
 #define CreateFontIndirect CreateFontIndirectM
+HFONT CreateFontIndirectM(CONST LOGFONTA *lplf);
 #undef ChooseFont
 #define ChooseFont ChooseFontM
+BOOL ChooseFontM(LPCHOOSEFONTA v0);
 #undef DialogBoxParam
 #define DialogBoxParam DialogBoxParamM
+INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
 #undef CreateDialogParam
 #define CreateDialogParam CreateDialogParamM
+HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
 #undef mkdir
 #define mkdir _mkdirM
+int mkdirM(const char * _Path);
 #undef _mkdir
 #define _mkdir _mkdirM
+int _mkdirM(const char * _Path);
 #undef rmdir
 #define rmdir rmdirM
+int rmdirM(const char * _Path);
 #undef _rmdir
 #define _rmdir _rmdirM
+int _rmdirM(const char * _Path);
 #undef _mbslen
 #define _mbslen _mbslenM
+size_t _mbslenM(const unsigned char * _Str);
 #undef _mbschr
 #define _mbschr _mbschrM
+unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch);
 #undef _mbsrchr
 #define _mbsrchr _mbsrchrM
+unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch);
 #undef _mbsstr
 #define _mbsstr _mbsstrM
+unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr);
 #undef _mbscmp
 #define _mbscmp _mbscmpM
+int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2);
 #undef _mbsicmp
 #define _mbsicmp _mbsicmpM
+int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2);
 #undef _mbsncmp
 #define _mbsncmp _mbsncmpM
+int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount);
 #undef _mbslwr
 #define _mbslwr _mbslwrM
+unsigned char * _mbslwrM(unsigned char * _String);
 #undef _mbsupr
 #define _mbsupr _mbsuprM
+unsigned char * _mbsuprM(unsigned char * _String);
 #undef _mbsninc
 #define _mbsninc _mbsnincM
+unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count);
 
 #undef CreateWindow
 #define CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) CreateWindowEx(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
index bfa1106..e441fed 100644 (file)
 #define MSGJPN317              "Using SSH FTP (SFTP)."\r
 #define MSGJPN318              "OpenSSL is loaded."\r
 #define MSGJPN319              "OpenSSL is not installed.\r\nCommunication will not be encrypted."\r
+#define MSGJPN320              "Feature"\r
index 537fbad..cb35a21 100644 (file)
 #define MSGJPN317              "Using SSH FTP (SFTP)."
 #define MSGJPN318              "OpenSSL is loaded."
 #define MSGJPN319              "OpenSSL is not installed.\r\nCommunication will not be encrypted."
+#define MSGJPN320              "Feature"
index 5ca9fb1..0b1b071 100644 (file)
 #define MSGJPN317              "SSH FTP (SFTP)\xE3\x82\x92\xE4\xBD\xBF\xE7\x94\xA8\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99."\r
 #define MSGJPN318              "OpenSSL\xE3\x81\x8C\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F."\r
 #define MSGJPN319              "OpenSSL\xE3\x81\x8C\xE3\x82\xA4\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xBC\xE3\x83\xAB\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\r\n\xE9\x80\x9A\xE4\xBF\xA1\xE3\x81\xAE\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\xAF\xE8\xA1\x8C\xE3\x82\x8F\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93."\r
+#define MSGJPN320              "\xE7\x89\xB9\xE6\xAE\x8A\xE6\xA9\x9F\xE8\x83\xBD"\r
index 275e937..3b4b7ef 100644 (file)
 #define MSGJPN317              "SSH FTP (SFTP)\82ð\8eg\97p\82µ\82Ü\82·."
 #define MSGJPN318              "OpenSSL\82ª\93Ç\82Ý\8d\9e\82Ü\82ê\82Ü\82µ\82½."
 #define MSGJPN319              "OpenSSL\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ.\r\n\92Ê\90M\82Ì\88Ã\8d\86\89»\82Í\8ds\82í\82ê\82Ü\82¹\82ñ."
+#define MSGJPN320              "\93Á\8eê\8b@\94\"
index b43af07..9edd32a 100644 (file)
--- a/option.c
+++ b/option.c
@@ -65,12 +65,19 @@ static BOOL CALLBACK ToolSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPA
 static BOOL CALLBACK SoundSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static BOOL CALLBACK MiscSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
-static int GetDecimalText(HWND hDlg, int Ctrl);\r
-static void SetDecimalText(HWND hDlg, int Ctrl, int Num);\r
-static void CheckRange2(int *Cur, int Max, int Min);\r
-static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize);\r
-static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text);\r
-static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize);\r
+// hostman.cで使用\r
+//static int GetDecimalText(HWND hDlg, int Ctrl);\r
+//static void SetDecimalText(HWND hDlg, int Ctrl, int Num);\r
+//static void CheckRange2(int *Cur, int Max, int Min);\r
+//static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize);\r
+//static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text);\r
+//static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize);\r
+int GetDecimalText(HWND hDlg, int Ctrl);\r
+void SetDecimalText(HWND hDlg, int Ctrl, int Num);\r
+void CheckRange2(int *Cur, int Max, int Min);\r
+void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize);\r
+void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text);\r
+void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize);\r
 \r
 \r
 \r
@@ -1647,7 +1654,9 @@ static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPA
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int GetDecimalText(HWND hDlg, int Ctrl)\r
+// hostman.cで使用\r
+//static int GetDecimalText(HWND hDlg, int Ctrl)\r
+int GetDecimalText(HWND hDlg, int Ctrl)\r
 {\r
        char Tmp[40];\r
 \r
@@ -1667,7 +1676,9 @@ static int GetDecimalText(HWND hDlg, int Ctrl)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void SetDecimalText(HWND hDlg, int Ctrl, int Num)\r
+// hostman.cで使用\r
+//static void SetDecimalText(HWND hDlg, int Ctrl, int Num)\r
+void SetDecimalText(HWND hDlg, int Ctrl, int Num)\r
 {\r
        char Tmp[40];\r
 \r
@@ -1691,7 +1702,9 @@ static void SetDecimalText(HWND hDlg, int Ctrl, int Num)
 *              int *Cur : 設定値\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void CheckRange2(int *Cur, int Max, int Min)\r
+// hostman.cで使用\r
+//static void CheckRange2(int *Cur, int Max, int Min)\r
+void CheckRange2(int *Cur, int Max, int Min)\r
 {\r
        if(*Cur < Min)\r
                *Cur = Min;\r
@@ -1713,7 +1726,9 @@ static void CheckRange2(int *Cur, int Max, int Min)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize)\r
+// hostman.cで使用\r
+//static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize)\r
+void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize)\r
 {\r
        char Tmp[FMAX_PATH+1];\r
        int Num;\r
@@ -1751,7 +1766,9 @@ static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text)\r
+// hostman.cで使用\r
+//static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text)\r
+void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text)\r
 {\r
        char *Pos;\r
 \r
@@ -1777,7 +1794,9 @@ static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize)\r
+// hostman.cで使用\r
+//static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize)\r
+void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize)\r
 {\r
        char Tmp[FMAX_PATH+1];\r
        int Num;\r
index fa6461d..578d3ac 100644 (file)
@@ -466,6 +466,8 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "FTPES", Hist.UseFTPES, DefaultHist.UseFTPES);\r
                                                        SaveIntNum(hKey5, "FTPIS", Hist.UseFTPIS, DefaultHist.UseFTPIS);\r
                                                        SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
+                                                       // 同時接続対応\r
+                                                       SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
 \r
                                                        CloseSubKey(hKey5);\r
                                                        n++;\r
@@ -538,6 +540,8 @@ void SaveRegistory(void)
                                                        SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES);\r
                                                        SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS);\r
                                                        SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
+                                                       // 同時接続対応\r
+                                                       SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
                                                }\r
                                                CloseSubKey(hKey5);\r
                                        }\r
@@ -792,6 +796,8 @@ int LoadRegistory(void)
                                        ReadIntValueFromReg(hKey5, "FTPES", &Hist.UseFTPES);\r
                                        ReadIntValueFromReg(hKey5, "FTPIS", &Hist.UseFTPIS);\r
                                        ReadIntValueFromReg(hKey5, "SFTP", &Hist.UseSFTP);\r
+                                       // 同時接続対応\r
+                                       ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
 \r
                                        CloseSubKey(hKey5);\r
                                        AddHistoryToHistory(&Hist);\r
@@ -863,6 +869,8 @@ int LoadRegistory(void)
                                        ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES);\r
                                        ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS);\r
                                        ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
+                                       // 同時接続対応\r
+                                       ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
 \r
                                        CloseSubKey(hKey5);\r
 \r
index 1b617be..3b8c736 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -389,12 +389,15 @@ int DoCHMOD(char *Path, char *Mode)
 *              サイズが選られない時は Size = -1 を返す\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoSIZE(char *Path, LONGLONG *Size)\r
+// 同時接続対応\r
+//int DoSIZE(char *Path, LONGLONG *Size)\r
+int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size)\r
 {\r
        int Sts;\r
        char Tmp[1024];\r
 \r
-       Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+//     Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+       Sts = CommandProcTrn(cSkt, Tmp, "SIZE %s", Path);\r
 \r
        *Size = -1;\r
        if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4]))\r
@@ -418,7 +421,9 @@ int DoSIZE(char *Path, LONGLONG *Size)
 *              日付が選られない時は Time = 0 を返す\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoMDTM(char *Path, FILETIME *Time)\r
+// 同時接続対応\r
+//int DoMDTM(char *Path, FILETIME *Time)\r
+int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time)\r
 {\r
        int Sts;\r
        char Tmp[1024];\r
@@ -427,7 +432,8 @@ int DoMDTM(char *Path, FILETIME *Time)
     Time->dwLowDateTime = 0;\r
     Time->dwHighDateTime = 0;\r
 \r
-       Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+//     Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+       Sts = CommandProcTrn(cSkt, Tmp, "MDTM %s", Path);\r
        if(Sts/100 == FTP_COMPLETE)\r
        {\r
                sTime.wMilliseconds = 0;\r
@@ -675,7 +681,9 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 *              転送コントロールソケットを使う\r
 *----------------------------------------------------------------------------*/\r
 \r
-int CommandProcTrn(char *Reply, char *fmt, ...)\r
+// 同時接続対応\r
+//int CommandProcTrn(char *Reply, char *fmt, ...)\r
+int CommandProcTrn(SOCKET cSkt, char *Reply, char *fmt, ...)\r
 {\r
        va_list Args;\r
        char Cmd[1024];\r
@@ -691,7 +699,8 @@ int CommandProcTrn(char *Reply, char *fmt, ...)
 //     if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429)\r
 //     {\r
 //             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-                       Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+//                     Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       Sts = command(cSkt, Reply, &CheckCancelFlg, "%s", Cmd);\r
 //     }\r
        return(Sts);\r
 }\r
@@ -1030,7 +1039,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
 //                             DisconnectSet();\r
                        {\r
                                if(SizeOnce == -1)\r
-                                       ReConnectCmdSkt();\r
+                                       ReConnectTrnSkt(&cSkt);\r
                                else\r
                                        DisconnectSet();\r
                        }\r
index b930424..c823465 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -457,7 +457,9 @@ static int RegistAsyncTable(SOCKET s)
        {\r
                if(Signal[Pos].Socket == s)\r
                {\r
-                       MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK);\r
+                       // 強制的に閉じられたソケットがあると重複する可能性あり\r
+//                     MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK);\r
+                       Signal[Pos].Socket = INVALID_SOCKET;\r
                        break;\r
                }\r
        }\r
@@ -521,7 +523,9 @@ static int RegistAsyncTableDbase(HANDLE Async)
        {\r
                if(SignalDbase[Pos].Async == Async)\r
                {\r
-                       MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK);\r
+                       // 強制的に閉じられたハンドルがあると重複する可能性あり\r
+//                     MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK);\r
+                       SignalDbase[Pos].Async = 0;\r
                        break;\r
                }\r
        }\r
@@ -714,7 +718,7 @@ int do_closesocket(SOCKET s)
        if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS)\r
                Ret = closesocketS(s);\r
        else\r
-               Ret = closesocket(s);\r
+               Ret = closesocketS(s);\r
        if(Ret == SOCKET_ERROR)\r
        {\r
                Error = 0;\r
index e3d4623..3159e93 100644 (file)
@@ -45,7 +45,7 @@ _SSL_peek pSSL_peek;
 _SSL_read pSSL_read;
 _SSL_get_error pSSL_get_error;
 
-#define MAX_SSL_SOCKET 16
+#define MAX_SSL_SOCKET 64
 
 BOOL g_bOpenSSLLoaded;
 HMODULE g_hOpenSSL;