OSDN Git Service

Fix bugs of simultaneous connection.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 25 Jan 2012 13:19:55 +0000 (22:19 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Wed, 25 Jan 2012 13:19:55 +0000 (22:19 +0900)
Change default settings for simultaneous connection.
Fix bugs of handling errors of transferring.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
common.h
getput.c
hostman.c
mbswrapper.c
registry.c
socket.c
socketwrapper.c

index 15c9f81..6d1aaca 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 5b89975..f1db394 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index d1f7b5c..877cac6 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1837,7 +1837,8 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int
 // 同時接続対応\r
 void RemoveReceivedData(SOCKET s);\r
 int CheckClosedAndReconnect(void);\r
-void CheckAllEventClosed(void);\r
+// 同時接続対応\r
+int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork);\r
 \r
 /*===== updatebell.c =====*/\r
 \r
index 28c2471..85897d7 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -753,40 +753,40 @@ static ULONG WINAPI TransferThread(void *Dummy)
                {\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, &Canceled[ThreadCount]);\r
-                                       // 同時ログイン数制限対策\r
-                                       if(TrnSkt != INVALID_SOCKET)\r
-                                               LastUsed = timeGetTime();\r
-                                       else\r
-                                       {\r
-                                               // 同時ログイン数制限に引っかかった可能性あり\r
-                                               // 負荷を下げるために約10秒間待機\r
-                                               i = 10000;\r
-                                               while(NewCmdSkt != CmdSkt && i > 0)\r
-                                               {\r
-                                                       BackgrndMessageProc();\r
-                                                       Sleep(1);\r
-                                                       i--;\r
-                                               }\r
-                                       }\r
-//                                     WaitForSingleObject(hListAccMutex, INFINITE);\r
-                                       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               else\r
+                                       CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+                               // 同時ログイン数制限対策\r
+                               if(TrnSkt != INVALID_SOCKET)\r
+                                       LastUsed = timeGetTime();\r
+                               else\r
+                               {\r
+                                       // 同時ログイン数制限に引っかかった可能性あり\r
+                                       // 負荷を下げるために約10秒間待機\r
+                                       i = 10000;\r
+                                       while(NewCmdSkt != CmdSkt && i > 0)\r
                                        {\r
                                                BackgrndMessageProc();\r
                                                Sleep(1);\r
+                                               i--;\r
                                        }\r
                                }\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
                        }\r
                        else\r
                        {\r
                                if(TrnSkt != INVALID_SOCKET)\r
                                {\r
                                        // 同時ログイン数制限対策\r
-                                       // 10秒間は再利用を許可\r
-                                       if(timeGetTime() - LastUsed > 10000)\r
+                                       // 60秒間使用されなければログアウト\r
+                                       if(timeGetTime() - LastUsed > 60000)\r
                                        {\r
                                                ReleaseMutex(hListAccMutex);\r
                                                SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
@@ -1305,7 +1305,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
        {\r
                iRetCode = 500;\r
                SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile));\r
-               DispDownloadFinishMsg(Pkt, iRetCode);\r
+               // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//             DispDownloadFinishMsg(Pkt, iRetCode);\r
        }\r
        else if(Pkt->Mode != EXIST_IGNORE)\r
        {\r
@@ -1352,6 +1353,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
                SetTaskMsg(MSGJPN089, Pkt->RemoteFile);\r
                iRetCode = 200;\r
        }\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+       DispDownloadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -1466,7 +1469,8 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                iRetCode = 500;\r
                SetErrorMsg(MSGJPN279);\r
        }\r
-       DispDownloadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispDownloadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -1563,7 +1567,8 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
        else\r
                SetErrorMsg(Buf);\r
 \r
-       DispDownloadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispDownloadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -2600,7 +2605,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                        SetTaskMsg(MSGJPN105, Pkt->LocalFile);\r
                        iRetCode = 500;\r
                        Pkt->Abort = ABORT_ERROR;\r
-                       DispUploadFinishMsg(Pkt, iRetCode);\r
+                       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//                     DispUploadFinishMsg(Pkt, iRetCode);\r
                }\r
        }\r
        else\r
@@ -2609,6 +2615,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                SetTaskMsg(MSGJPN107, Pkt->LocalFile);\r
                iRetCode = 200;\r
        }\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+       DispUploadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -2737,7 +2745,8 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                SetErrorMsg(MSGJPN279);\r
                iRetCode = 500;\r
        }\r
-       DispUploadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispUploadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -2854,7 +2863,8 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
        else\r
                SetErrorMsg(Buf);\r
 \r
-       DispUploadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispUploadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
index 0249d1a..07c2ffc 100644 (file)
--- a/hostman.c
+++ b/hostman.c
@@ -1344,7 +1344,7 @@ void CopyDefaultHost(HOSTDATA *Set)
        strcpy(Set->PrivateKey, "");\r
        // 同時接続対応\r
        Set->MaxThreadCount = 1;\r
-       Set->ReuseCmdSkt = NO;\r
+       Set->ReuseCmdSkt = YES;\r
        Set->NoDisplayUI = NO;\r
        // MLSD対応\r
        Set->Feature = 0;\r
index 12b19ee..86a1b21 100644 (file)
@@ -699,10 +699,28 @@ END_ROUTINE
 ATOM RegisterClassExM(CONST WNDCLASSEXA * v0)\r
 {\r
        ATOM r = 0;\r
+       wchar_t* pw0 = NULL;\r
+       wchar_t* pw1 = NULL;\r
+       WNDCLASSEXW a0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
-       r = RegisterClassExA(v0);\r
+       a0.cbSize = sizeof(WNDCLASSEXW);\r
+       a0.style = v0->style;\r
+       a0.lpfnWndProc = v0->lpfnWndProc;\r
+       a0.cbClsExtra = v0->cbClsExtra;\r
+       a0.cbWndExtra = v0->cbWndExtra;\r
+       a0.hInstance = v0->hInstance;\r
+       a0.hIcon = v0->hIcon;\r
+       a0.hCursor = v0->hCursor;\r
+       a0.hbrBackground = v0->hbrBackground;\r
+       pw0 = DuplicateMtoW(v0->lpszMenuName, -1);\r
+       a0.lpszMenuName = pw0;\r
+       pw1 = DuplicateMtoW(v0->lpszClassName, -1);\r
+       a0.lpszClassName = pw1;\r
+       a0.hIconSm = v0->hIconSm;\r
+       r = RegisterClassExW(&a0);\r
 END_ROUTINE\r
+       FreeDuplicatedString(pw0);\r
+       FreeDuplicatedString(pw1);\r
        return r;\r
 }\r
 \r
@@ -725,7 +743,6 @@ LONG GetWindowLongM(HWND hWnd, int nIndex)
 {\r
        LONG r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = GetWindowLongW(hWnd, nIndex);\r
        else\r
@@ -738,7 +755,6 @@ LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong)
 {\r
        LONG r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = SetWindowLongW(hWnd, nIndex, dwNewLong);\r
        else\r
@@ -751,7 +767,6 @@ LONG_PTR GetWindowLongPtrM(HWND hWnd, int nIndex)
 {\r
        LONG_PTR r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = GetWindowLongPtrW(hWnd, nIndex);\r
        else\r
@@ -764,7 +779,6 @@ LONG_PTR SetWindowLongPtrM(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
 {\r
        LONG_PTR r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = SetWindowLongPtrW(hWnd, nIndex, dwNewLong);\r
        else\r
@@ -777,7 +791,6 @@ LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
 {\r
        LRESULT r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = DefWindowProcW(hWnd, Msg, wParam, lParam);\r
        else\r
@@ -790,7 +803,6 @@ LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wPara
 {\r
        LRESULT r = 0;\r
 START_ROUTINE\r
-       // WNDPROCがShift_JIS用であるため\r
        if(IsWindowUnicode(hWnd))\r
                r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);\r
        else\r
@@ -1978,6 +1990,7 @@ BOOL ChooseFontM(LPCHOOSEFONTA v0)
 {\r
        BOOL r = FALSE;\r
        wchar_t* pw0 = NULL;\r
+       wchar_t* pw1 = NULL;\r
        CHOOSEFONTW a0;\r
        LOGFONTW* pwlf;\r
 START_ROUTINE\r
@@ -2010,9 +2023,11 @@ START_ROUTINE
        a0.rgbColors = v0->rgbColors;\r
        a0.lCustData = v0->lCustData;\r
        a0.lpfnHook = v0->lpfnHook;\r
-       a0.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);\r
+       pw0 = DuplicateMtoW(v0->lpTemplateName, -1);\r
+       a0.lpTemplateName = pw0;\r
        a0.hInstance = v0->hInstance;\r
-       a0.lpszStyle = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);\r
+       pw1 = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);\r
+       a0.lpszStyle = pw1;\r
        a0.nFontType = v0->nFontType;\r
        a0.nSizeMin = v0->nSizeMin;\r
        a0.nSizeMax = v0->nSizeMax;\r
@@ -2036,15 +2051,14 @@ START_ROUTINE
                TerminateStringM(v0->lpLogFont->lfFaceName, LF_FACESIZE);\r
        }\r
        v0->rgbColors = a0.rgbColors;\r
-       WtoM(v0->lpszStyle, LF_FACESIZE, a0.lpszStyle, -1);\r
+       WtoM(v0->lpszStyle, LF_FACESIZE, pw1, -1);\r
        TerminateStringM(v0->lpszStyle, LF_FACESIZE);\r
        v0->nFontType = a0.nFontType;\r
        if(pwlf)\r
                free(pwlf);\r
-       FreeDuplicatedString((void*)a0.lpTemplateName);\r
-       FreeDuplicatedString(a0.lpszStyle);\r
 END_ROUTINE\r
        FreeDuplicatedString(pw0);\r
+       FreeDuplicatedString(pw1);\r
        return r;\r
 }\r
 \r
index f51900a..be28d9c 100644 (file)
@@ -960,6 +960,12 @@ int LoadRegistory(void)
                                        // 同時接続対応\r
                                        ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
                                        ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
+                                       // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし\r
+                                       if(Version < 1985)\r
+                                       {\r
+                                               if(Host.MaxThreadCount > 1)\r
+                                                       Host.ReuseCmdSkt = NO;\r
+                                       }\r
                                        // MLSD対応\r
                                        ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
                                        // IPv6対応\r
index db7b69f..622dba0 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -1225,3 +1225,19 @@ int CheckClosedAndReconnect(void)
 \r
 \r
 \r
+// 同時接続対応\r
+int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork)\r
+{\r
+       int Error;\r
+       int Sts;\r
+\r
+//SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");\r
+\r
+       Sts = FFFTP_SUCCESS;\r
+       if(AskAsyncDone(*Skt, &Error, FD_CLOSE) == YES)\r
+       {\r
+               Sts = ReConnectTrnSkt(Skt, CancelCheckWork);\r
+       }\r
+       return(Sts);\r
+}\r
+\r
index e5ab3f7..dcd54c8 100644 (file)
@@ -1045,6 +1045,7 @@ BOOL LoadPuTTY()
        // ビルドしたputty.dllに合わせてSHA1ハッシュ値を変更すること\r
        RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");\r
 #endif\r
+       // デバッグ用\r
 //     g_hPuTTY = LoadLibrary("putty.dll");\r
        g_hPuTTY = LoadLibrary("C:\\SourceForge\\ffftp\\putty\\Debug\\PuTTY.dll");\r
        if(!g_hPuTTY\r