• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

Revisión27e47ec02a3553a6e9b4e935a43dc28919d91c0d (tree)
Tiempo2011-11-12 00:40:56
Autors_kawamoto <s_kawamoto@user...>
Commiters_kawamoto

Log Message

Add routines for IPv6.
Fix bugs of simultaneous connection.
Add support for reusing control connection.

Cambiar Resumen

Diferencia incremental

Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
--- a/Resource/FFFTP.rc
+++ b/Resource/FFFTP.rc
@@ -1364,6 +1364,7 @@ BEGIN
13641364 EDITTEXT HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER
13651365 CONTROL "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14
13661366 LTEXT "(1`4)",-1,102,10,31,8
1367+ CONTROL "ƒƒCƒ“ƒEƒBƒ“ƒhƒE‚̃\ƒPƒbƒg‚ðÄ—˜—p",HSET_REUSE_SOCKET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,27,131,10
13671368 END
13681369
13691370
--- a/Resource/resource.h
+++ b/Resource/resource.h
@@ -430,6 +430,7 @@
430430 #define HSET_THREAD_COUNT 1204
431431 #define HSET_THREAD_COUNT_SPN 1205
432432 #define HSET_UTF8BOM_CNV 1206
433+#define HSET_REUSE_SOCKET 1207
433434 #define MENU_END 40001
434435 #define MENU_EXIT 40001
435436 #define MENU_CONNECT 40003
@@ -616,7 +617,7 @@
616617 #ifndef APSTUDIO_READONLY_SYMBOLS
617618 #define _APS_NEXT_RESOURCE_VALUE 191
618619 #define _APS_NEXT_COMMAND_VALUE 40176
619-#define _APS_NEXT_CONTROL_VALUE 1207
620+#define _APS_NEXT_CONTROL_VALUE 1208
620621 #define _APS_NEXT_SYMED_VALUE 101
621622 #endif
622623 #endif
--- a/Resource_eng/FFFTP-eng.rc
+++ b/Resource_eng/FFFTP-eng.rc
@@ -1390,6 +1390,7 @@ BEGIN
13901390 EDITTEXT HSET_THREAD_COUNT,72,8,17,12,ES_AUTOHSCROLL | ES_NUMBER
13911391 CONTROL "Spin1",HSET_THREAD_COUNT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,89,7,9,14
13921392 LTEXT "(1 to 4 threads)",-1,102,10,53,8
1393+ CONTROL "Reuse socket of the main window",HSET_REUSE_SOCKET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,27,131,10
13931394 END
13941395
13951396
--- a/Resource_eng/resource.h
+++ b/Resource_eng/resource.h
@@ -430,6 +430,7 @@
430430 #define HSET_THREAD_COUNT 1204
431431 #define HSET_THREAD_COUNT_SPN 1205
432432 #define HSET_UTF8BOM_CNV 1206
433+#define HSET_REUSE_SOCKET 1207
433434 #define MENU_END 40001
434435 #define MENU_EXIT 40001
435436 #define MENU_CONNECT 40003
@@ -616,7 +617,7 @@
616617 #ifndef APSTUDIO_READONLY_SYMBOLS
617618 #define _APS_NEXT_RESOURCE_VALUE 191
618619 #define _APS_NEXT_COMMAND_VALUE 40176
619-#define _APS_NEXT_CONTROL_VALUE 1207
620+#define _APS_NEXT_CONTROL_VALUE 1208
620621 #define _APS_NEXT_SYMED_VALUE 101
621622 #endif
622623 #endif
--- a/common.h
+++ b/common.h
@@ -946,6 +946,7 @@ typedef struct {
946946 char PrivateKey[PRIVATE_KEY_LEN+1]; /* テキスト形式の秘密鍵 */
947947 // 同時接続対応
948948 int MaxThreadCount; /* 同時接続数 */
949+ int ReuseCmdSkt; /* メインウィンドウのソケットを再利用する (YES/NO) */
949950 // FEAT対応
950951 int Feature; /* 利用可能な機能のフラグ (FEATURE_xxx) */
951952 // MLSD対応
@@ -1006,6 +1007,7 @@ typedef struct historydata {
10061007 char PrivateKey[PRIVATE_KEY_LEN+1]; /* テキスト形式の秘密鍵 */
10071008 // 同時接続対応
10081009 int MaxThreadCount; /* 同時接続数 */
1010+ int ReuseCmdSkt; /* メインウィンドウのソケットを再利用する (YES/NO) */
10091011 // MLSD対応
10101012 int UseMLSD; /* "MLSD"コマンドを使用する */
10111013 // IPv6対応
@@ -1428,6 +1430,7 @@ int AskUseSFTP(void);
14281430 char *AskPrivateKey(void);
14291431 // 同時接続対応
14301432 int AskMaxThreadCount(void);
1433+int AskReuseCmdSkt(void);
14311434 // FEAT対応
14321435 int AskHostFeature(void);
14331436 // MLSD対応
--- a/connect.c
+++ b/connect.c
@@ -990,9 +990,7 @@ int ReConnectCmdSkt(void)
990990 int Sts;
991991
992992
993- // 同時接続対応
994-// if(CmdCtrlSocket != TrnCtrlSocket)
995- if(CmdCtrlSocket != TrnCtrlSocket && TrnCtrlSocket != INVALID_SOCKET)
993+ if(CmdCtrlSocket != TrnCtrlSocket)
996994 do_closesocket(TrnCtrlSocket);
997995 TrnCtrlSocket = INVALID_SOCKET;
998996
@@ -1150,10 +1148,13 @@ void SktShareProh(void)
11501148 //SetTaskMsg("############### SktShareProh");
11511149
11521150 // 同時接続対応
1153- // 転送スレッドがソケットを各自で用意
1154- // TrnCtrlSocketはメインスレッド以外から使用されない
11551151 // CmdCtrlSocket = INVALID_SOCKET;
11561152 // ReConnectSkt(&CmdCtrlSocket);
1153+ if(CurHost.ReuseCmdSkt == YES)
1154+ {
1155+ CmdCtrlSocket = INVALID_SOCKET;
1156+ ReConnectSkt(&CmdCtrlSocket);
1157+ }
11571158 }
11581159 return;
11591160 }
@@ -1174,8 +1175,10 @@ int AskShareProh(void)
11741175 int Sts;
11751176
11761177 Sts = YES;
1178+ // 同時接続対応
11771179 // if(CmdCtrlSocket == TrnCtrlSocket)
1178-// Sts = NO;
1180+ if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET)
1181+ Sts = NO;
11791182
11801183 return(Sts);
11811184 }
@@ -2475,6 +2478,11 @@ int AskMaxThreadCount(void)
24752478 return(CurHost.MaxThreadCount);
24762479 }
24772480
2481+int AskReuseCmdSkt(void)
2482+{
2483+ return(CurHost.ReuseCmdSkt);
2484+}
2485+
24782486 // FEAT対応
24792487 int AskHostFeature(void)
24802488 {
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -129,9 +129,6 @@ void DownLoadProc(int ChName, int ForceFile, int All)
129129 {
130130 DisableUserOpe();
131131
132- // 同時接続対応
133- SktShareProh();
134-
135132 ExistNotify = YES;
136133 // KeepTransferDialog(YES);
137134
@@ -263,9 +260,6 @@ void DirectDownLoadProc(char *Fname)
263260 {
264261 DisableUserOpe();
265262
266- // 同時接続対応
267- SktShareProh();
268-
269263 ExistNotify = YES;
270264 // KeepTransferDialog(YES);
271265
@@ -405,9 +399,6 @@ void MirrorDownloadProc(int Notify)
405399 {
406400 DisableUserOpe();
407401
408- // 同時接続対応
409- SktShareProh();
410-
411402 Base = NULL;
412403
413404 if(Notify == YES)
@@ -879,9 +870,6 @@ void UpLoadListProc(int ChName, int All)
879870 {
880871 DisableUserOpe();
881872
882- // 同時接続対応
883- SktShareProh();
884-
885873 // ローカル側で選ばれているファイルをFileListBaseに登録
886874 FileListBase = NULL;
887875 MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);
@@ -1050,9 +1038,6 @@ void UpLoadDragProc(WPARAM wParam)
10501038 {
10511039 DisableUserOpe();
10521040
1053- // 同時接続対応
1054- SktShareProh();
1055-
10561041 // ローカル側で選ばれているファイルをFileListBaseに登録
10571042 FileListBase = NULL;
10581043 MakeDroppedFileList(wParam, Cur, &FileListBase);
@@ -1212,9 +1197,6 @@ void MirrorUploadProc(int Notify)
12121197 {
12131198 DisableUserOpe();
12141199
1215- // 同時接続対応
1216- SktShareProh();
1217-
12181200 Base = NULL;
12191201
12201202 if(Notify == YES)
--- a/getput.c
+++ b/getput.c
@@ -41,7 +41,9 @@
4141 #include <string.h>
4242 #include <mbstring.h>
4343 #include <time.h>
44-#include <winsock.h>
44+// IPv6対応
45+//#include <winsock.h>
46+#include <winsock2.h>
4547 #include <windowsx.h>
4648 #include <commctrl.h>
4749 #include <process.h>
@@ -711,44 +713,53 @@ static ULONG WINAPI TransferThread(void *Dummy)
711713 free(Pos);
712714 }
713715 NewCmdSkt = AskCmdCtrlSkt();
714- if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())
716+ if(AskReuseCmdSkt() == YES && ThreadCount == 0)
715717 {
716- if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)
718+ if(TransPacketBase && ThreadCount < AskMaxThreadCount())
719+ TrnSkt = AskTrnCtrlSkt();
720+ }
721+ else
722+ {
723+ if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())
717724 {
718- ReleaseMutex(hListAccMutex);
719- ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);
720- // 同時ログイン数制限に引っかかった可能性あり
721- // 負荷を下げるためにしばらく待機
722- if(TrnSkt == INVALID_SOCKET)
725+ if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)
723726 {
724- i = 10000;
725- while(NewCmdSkt != CmdSkt && i > 0)
727+ ReleaseMutex(hListAccMutex);
728+ ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);
729+ // 同時ログイン数制限に引っかかった可能性あり
730+ // 負荷を下げるためにしばらく待機
731+ if(TrnSkt == INVALID_SOCKET)
732+ {
733+ i = 10000;
734+ while(NewCmdSkt != CmdSkt && i > 0)
735+ {
736+ BackgrndMessageProc();
737+ Sleep(1);
738+ i--;
739+ }
740+ }
741+// WaitForSingleObject(hListAccMutex, INFINITE);
742+ while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)
726743 {
727744 BackgrndMessageProc();
728745 Sleep(1);
729- i--;
730746 }
731747 }
732-// WaitForSingleObject(hListAccMutex, INFINITE);
733- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)
734- {
735- BackgrndMessageProc();
736- Sleep(1);
737- }
738748 }
739- }
740- else
741- {
742- if(TrnSkt != INVALID_SOCKET)
749+ else
743750 {
744- ReleaseMutex(hListAccMutex);
745- DoClose(TrnSkt);
746- TrnSkt = INVALID_SOCKET;
747-// WaitForSingleObject(hListAccMutex, INFINITE);
748- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)
751+ if(TrnSkt != INVALID_SOCKET)
749752 {
750- BackgrndMessageProc();
751- Sleep(1);
753+ ReleaseMutex(hListAccMutex);
754+ SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);
755+ DoClose(TrnSkt);
756+ TrnSkt = INVALID_SOCKET;
757+// WaitForSingleObject(hListAccMutex, INFINITE);
758+ while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)
759+ {
760+ BackgrndMessageProc();
761+ Sleep(1);
762+ }
752763 }
753764 }
754765 }
@@ -1017,7 +1028,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
10171028 // else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0)
10181029 else if(strcmp(Pos->Cmd, "SETCUR") == 0)
10191030 {
1020- if(AskShareProh() == YES)
1031+// if(AskShareProh() == YES)
1032+ if(AskReuseCmdSkt() == NO || AskShareProh() == YES)
10211033 {
10221034 // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)
10231035 if(strcmp(CurDir[Pos->ThreadCount], Pos->RemoteFile) != 0)
@@ -1038,7 +1050,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
10381050 // else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0)
10391051 else if(strcmp(Pos->Cmd, "BACKCUR") == 0)
10401052 {
1041- if(AskShareProh() == NO)
1053+// if(AskShareProh() == NO)
1054+ if(AskReuseCmdSkt() == YES && AskShareProh() == NO)
10421055 {
10431056 // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)
10441057 // CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile);
@@ -1172,8 +1185,14 @@ static ULONG WINAPI TransferThread(void *Dummy)
11721185 Sleep(100);
11731186 }
11741187 }
1175- if(TrnSkt != INVALID_SOCKET)
1176- DoClose(TrnSkt);
1188+ if(AskReuseCmdSkt() == NO || ThreadCount > 0)
1189+ {
1190+ if(TrnSkt != INVALID_SOCKET)
1191+ {
1192+ SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);
1193+ DoClose(TrnSkt);
1194+ }
1195+ }
11771196 return 0;
11781197 }
11791198
@@ -3722,6 +3741,59 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max)
37223741 }
37233742
37243743
3744+// IPv6対応
3745+static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family)
3746+{
3747+ char *Pos;
3748+ char *Btm;
3749+ int Sts;
3750+
3751+ Sts = FFFTP_FAIL;
3752+
3753+ Pos = strchr(Str, '|');
3754+ if(Pos != NULL)
3755+ {
3756+ Pos++;
3757+ Btm = strchr(Pos, '|');
3758+ if(Btm != NULL)
3759+ {
3760+ switch(atoi(Pos))
3761+ {
3762+ case 1:
3763+ *Family = AF_INET;
3764+ break;
3765+ case 2:
3766+ *Family = AF_INET6;
3767+ break;
3768+ }
3769+ Pos = Btm + 1;
3770+ Btm = strchr(Pos, '|');
3771+ if(Btm != NULL)
3772+ {
3773+ if((Btm - Pos) <= Max)
3774+ {
3775+ if((Btm - Pos) > 0)
3776+ {
3777+ strncpy(Adrs, Pos, Btm - Pos);
3778+ *(Adrs + (Btm - Pos)) = NUL;
3779+ }
3780+
3781+ Pos = Btm + 1;
3782+ Btm = strchr(Pos, '|');
3783+ if(Btm != NULL)
3784+ {
3785+ Btm++;
3786+ *Port = atoi(Pos);
3787+ Sts = FFFTP_SUCCESS;
3788+ }
3789+ }
3790+ }
3791+ }
3792+ }
3793+ return(Sts);
3794+}
3795+
3796+
37253797 /*----- Windowsのスペシャルデバイスかどうかを返す -----------------------------
37263798 *
37273799 * Parameter
--- a/history.c
+++ b/history.c
@@ -231,6 +231,7 @@ static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New)
231231 strcpy(New->PrivateKey, Host->PrivateKey);
232232 // 同時接続対応
233233 New->MaxThreadCount = Host->MaxThreadCount;
234+ New->ReuseCmdSkt = Host->ReuseCmdSkt;
234235 // MLSD対応
235236 New->UseMLSD = Host->UseMLSD;
236237 // IPv6対応
@@ -292,6 +293,7 @@ void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host)
292293 strcpy(Host->PrivateKey, Hist->PrivateKey);
293294 // 同時接続対応
294295 Host->MaxThreadCount = Hist->MaxThreadCount;
296+ Host->ReuseCmdSkt = Hist->ReuseCmdSkt;
295297 // MLSD対応
296298 Host->UseMLSD = Hist->UseMLSD;
297299 // IPv6対応
--- a/hostman.c
+++ b/hostman.c
@@ -1036,6 +1036,7 @@ int CopyHostFromListInConnect(int Num, HOSTDATA *Set)
10361036 Set->UseSFTP = Pos->Set.UseSFTP;
10371037 // 同時接続対応
10381038 Set->MaxThreadCount = Pos->Set.MaxThreadCount;
1039+ Set->ReuseCmdSkt = Pos->Set.ReuseCmdSkt;
10391040 // MLSD対応
10401041 Set->UseMLSD = Pos->Set.UseMLSD;
10411042 // IPv6対応
@@ -1322,6 +1323,7 @@ void CopyDefaultHost(HOSTDATA *Set)
13221323 strcpy(Set->PrivateKey, "");
13231324 // 同時接続対応
13241325 Set->MaxThreadCount = 1;
1326+ Set->ReuseCmdSkt = NO;
13251327 // MLSD対応
13261328 Set->Feature = 0;
13271329 Set->UseMLSD = YES;
@@ -2213,6 +2215,7 @@ static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LP
22132215 SendDlgItemMessage(hDlg, HSET_THREAD_COUNT, EM_LIMITTEXT, (WPARAM)1, 0);
22142216 SetDecimalText(hDlg, HSET_THREAD_COUNT, TmpHost.MaxThreadCount);
22152217 SendDlgItemMessage(hDlg, HSET_THREAD_COUNT_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_DATA_CONNECTION, 1));
2218+ SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_SETCHECK, TmpHost.ReuseCmdSkt, 0);
22162219 return(TRUE);
22172220
22182221 case WM_NOTIFY:
@@ -2222,6 +2225,7 @@ static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LP
22222225 case PSN_APPLY :
22232226 TmpHost.MaxThreadCount = GetDecimalText(hDlg, HSET_THREAD_COUNT);
22242227 CheckRange2(&TmpHost.MaxThreadCount, MAX_DATA_CONNECTION, 1);
2228+ TmpHost.ReuseCmdSkt = SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_GETCHECK, 0, 0);
22252229 Apply = YES;
22262230 break;
22272231
--- a/main.c
+++ b/main.c
@@ -218,8 +218,6 @@ int MirUpDelNotify = YES;
218218 int MirDownDelNotify = YES;
219219 int FolderAttr = NO;
220220 int FolderAttrNum = 777;
221-// 同時接続対応
222-int MaxThreadCount = 1;
223221 // 暗号化通信対応
224222 BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];
225223
--- a/registry.c
+++ b/registry.c
@@ -479,6 +479,7 @@ void SaveRegistory(void)
479479 SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey);
480480 // 同時接続対応
481481 SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);
482+ SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt);
482483 // MLSD対応
483484 SaveIntNum(hKey5, "MLSD", Hist.UseMLSD, DefaultHist.UseMLSD);
484485 // IPv6対応
@@ -560,6 +561,7 @@ void SaveRegistory(void)
560561 SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);
561562 // 同時接続対応
562563 SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);
564+ SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);
563565 // MLSD対応
564566 SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);
565567 // IPv6対応
@@ -832,6 +834,7 @@ int LoadRegistory(void)
832834 DecodePassword(Str, Hist.PrivateKey);
833835 // 同時接続対応
834836 ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);
837+ ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt);
835838 // MLSD対応
836839 ReadIntValueFromReg(hKey5, "MLSD", &Hist.UseMLSD);
837840 // IPv6対応
@@ -922,6 +925,7 @@ int LoadRegistory(void)
922925 DecodePassword(Str, Host.PrivateKey);
923926 // 同時接続対応
924927 ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);
928+ ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);
925929 // MLSD対応
926930 ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);
927931 // IPv6対応
--- a/socket.c
+++ b/socket.c
@@ -28,6 +28,8 @@
2828 /============================================================================*/
2929
3030 #define STRICT
31+// IPv6対応
32+#include <ws2tcpip.h>
3133 #include <windows.h>
3234 #include <stdio.h>
3335 #include <stdlib.h>
@@ -47,11 +49,12 @@
4749
4850
4951
50-#define FD_CONNECT_BIT 0x0001
51-#define FD_CLOSE_BIT 0x0002
52-#define FD_ACCEPT_BIT 0x0004
53-#define FD_READ_BIT 0x0008
54-#define FD_WRITE_BIT 0x0010
52+// Winsock2で定義される定数と名前が重複し値が異なるため使用不可
53+//#define FD_CONNECT_BIT 0x0001
54+//#define FD_CLOSE_BIT 0x0002
55+//#define FD_ACCEPT_BIT 0x0004
56+//#define FD_READ_BIT 0x0008
57+//#define FD_WRITE_BIT 0x0010
5558
5659
5760
@@ -79,8 +82,8 @@ typedef struct {
7982 // 念のためテーブルを増量
8083 //#define MAX_SIGNAL_ENTRY 10
8184 //#define MAX_SIGNAL_ENTRY_DBASE 5
82-#define MAX_SIGNAL_ENTRY 100
83-#define MAX_SIGNAL_ENTRY_DBASE 50
85+#define MAX_SIGNAL_ENTRY 16
86+#define MAX_SIGNAL_ENTRY_DBASE 16
8487
8588
8689
@@ -96,6 +99,8 @@ static int UnRegistAsyncTable(SOCKET s);
9699 static int UnRegistAsyncTableDbase(HANDLE Async);
97100 // UTF-8対応
98101 static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen);
102+// IPv6対応
103+static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);
99104
100105
101106 /*===== 外部参照 =====*/
@@ -335,22 +340,22 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask)
335340 *Error = Signal[Pos].Error;
336341 if(Signal[Pos].Error != 0)
337342 Sts = YES;
338- if((Mask & FD_CONNECT_BIT) && (Signal[Pos].FdConnect != 0))
343+ if((Mask & FD_CONNECT) && (Signal[Pos].FdConnect != 0))
339344 {
340345 Sts = YES;
341346 #if DBG_MSG
342347 DoPrintf("### Ask: connect (Sts=%d, Error=%d)", Sts, *Error);
343348 #endif
344349 }
345- if((Mask & FD_CLOSE_BIT) && (Signal[Pos].FdClose != 0))
346-// if(Mask & FD_CLOSE_BIT)
350+ if((Mask & FD_CLOSE) && (Signal[Pos].FdClose != 0))
351+// if(Mask & FD_CLOSE)
347352 {
348353 Sts = YES;
349354 #if DBG_MSG
350355 DoPrintf("### Ask: close (Sts=%d, Error=%d)", Sts, *Error);
351356 #endif
352357 }
353- if((Mask & FD_ACCEPT_BIT) && (Signal[Pos].FdAccept != 0))
358+ if((Mask & FD_ACCEPT) && (Signal[Pos].FdAccept != 0))
354359 {
355360 Signal[Pos].FdAccept = 0;
356361 Sts = YES;
@@ -358,7 +363,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask)
358363 DoPrintf("### Ask: accept (Sts=%d, Error=%d)", Sts, *Error);
359364 #endif
360365 }
361- if((Mask & FD_READ_BIT) && (Signal[Pos].FdRead != 0))
366+ if((Mask & FD_READ) && (Signal[Pos].FdRead != 0))
362367 {
363368 Signal[Pos].FdRead = 0;
364369 Sts = YES;
@@ -366,7 +371,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask)
366371 DoPrintf("### Ask: read (Sts=%d, Error=%d)", Sts, *Error);
367372 #endif
368373 }
369- if((Mask & FD_WRITE_BIT) && (Signal[Pos].FdWrite != 0))
374+ if((Mask & FD_WRITE) && (Signal[Pos].FdWrite != 0))
370375 {
371376 Signal[Pos].FdWrite = 0;
372377 Sts = YES;
@@ -382,7 +387,7 @@ static int AskAsyncDone(SOCKET s, int *Error, int Mask)
382387
383388 if(Pos == MAX_SIGNAL_ENTRY)
384389 {
385- if(Mask & FD_CLOSE_BIT)
390+ if(Mask & FD_CLOSE)
386391 {
387392 Sts = YES;
388393 }
@@ -662,7 +667,9 @@ struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *Canc
662667
663668 // UTF-8対応
664669 // hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len);
665- hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len);
670+ // IPv6対応
671+// hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len);
672+ hAsync = WSAAsyncGetHostByNameIPv6M(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len, AF_INET);
666673 if(hAsync != NULL)
667674 {
668675 RegistAsyncTableDbase(hAsync);
@@ -731,7 +738,7 @@ int do_closesocket(SOCKET s)
731738 if(Ret == SOCKET_ERROR)
732739 {
733740 Error = 0;
734- while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE_BIT) != YES))
741+ while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE) != YES))
735742 {
736743 Sleep(1);
737744 if(BackgrndMessageProc() == YES)
@@ -778,7 +785,9 @@ int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCh
778785 #if DBG_MSG
779786 DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE");
780787 #endif
781- Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);
788+ // 高速化のためFD_READとFD_WRITEを使用しない
789+// Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);
790+ Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT);
782791 if(Ret != SOCKET_ERROR)
783792 {
784793 Ret = connect(s, name, namelen);
@@ -787,7 +796,7 @@ int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCh
787796 do
788797 {
789798 Error = 0;
790- while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT_BIT) != YES))
799+ while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT) != YES))
791800 {
792801 Sleep(1);
793802 if(BackgrndMessageProc() == YES)
@@ -859,9 +868,9 @@ SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen)
859868 Ret2 = INVALID_SOCKET;
860869 Error = 0;
861870
862- while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT_BIT) != YES))
871+ while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT) != YES))
863872 {
864- if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
873+ if(AskAsyncDone(s, &Error, FD_CLOSE) == YES)
865874 {
866875 Error = 1;
867876 break;
@@ -947,29 +956,30 @@ int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOutErr, int *Cance
947956
948957 // FTPS対応
949958 // OpenSSLでは受信確認はFD_READが複数回受信される可能性がある
950-// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))
951- while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES))
952- {
953- if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
954- {
955- Ret = 0;
956- break;
957- }
958- Sleep(1);
959- if(BackgrndMessageProc() == YES)
960- *CancelCheckWork = YES;
961- else if(TimeOut != 0)
962- {
963- time(&ElapseTime);
964- ElapseTime -= StartTime;
965- if(ElapseTime >= TimeOut)
966- {
967- DoPrintf("do_recv timed out");
968- *TimeOutErr = YES;
969- *CancelCheckWork = YES;
970- }
971- }
972- }
959+// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ) != YES))
960+ // 短時間にFD_READが2回以上通知される対策
961+// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ) != YES))
962+// {
963+// if(AskAsyncDone(s, &Error, FD_CLOSE) == YES)
964+// {
965+// Ret = 0;
966+// break;
967+// }
968+// Sleep(1);
969+// if(BackgrndMessageProc() == YES)
970+// *CancelCheckWork = YES;
971+// else if(TimeOut != 0)
972+// {
973+// time(&ElapseTime);
974+// ElapseTime -= StartTime;
975+// if(ElapseTime >= TimeOut)
976+// {
977+// DoPrintf("do_recv timed out");
978+// *TimeOutErr = YES;
979+// *CancelCheckWork = YES;
980+// }
981+// }
982+// }
973983
974984 if(/*(Ret != 0) && */(Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO))
975985 {
@@ -1055,11 +1065,11 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int
10551065
10561066 // FTPS対応
10571067 // 送信バッファの空き確認には影響しないが念のため
1058-// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))
1068+// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE) != YES))
10591069 // Windows 2000でFD_WRITEが通知されないことがあるバグ修正
1060-// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))
1070+// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE) != YES))
10611071 // {
1062-// if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)
1072+// if(AskAsyncDone(s, &Error, FD_CLOSE) == YES)
10631073 // {
10641074 // Error = 1;
10651075 // break;
@@ -1145,7 +1155,7 @@ void RemoveReceivedData(SOCKET s)
11451155 int Error;
11461156 while((len = recvS(s, buf, sizeof(buf), MSG_PEEK)) >= 0)
11471157 {
1148- AskAsyncDone(s, &Error, FD_READ_BIT);
1158+ AskAsyncDone(s, &Error, FD_READ);
11491159 recvS(s, buf, len, 0);
11501160 }
11511161 }
@@ -1168,7 +1178,7 @@ int CheckClosedAndReconnect(void)
11681178 //SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
11691179
11701180 Sts = FFFTP_SUCCESS;
1171- if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE_BIT) == YES)
1181+ if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE) == YES)
11721182 {
11731183 Sts = ReConnectCmdSkt();
11741184 }
@@ -1177,6 +1187,138 @@ int CheckClosedAndReconnect(void)
11771187
11781188
11791189
1190+// IPv6対応
1191+
1192+typedef struct
1193+{
1194+ HANDLE h;
1195+ HWND hWnd;
1196+ u_int wMsg;
1197+ char * name;
1198+ char * buf;
1199+ int buflen;
1200+ short Family;
1201+} GETHOSTBYNAMEDATA;
1202+
1203+static DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)
1204+{
1205+ GETHOSTBYNAMEDATA* pData;
1206+ struct hostent* pHost;
1207+ struct addrinfo* pAddr;
1208+ struct addrinfo* p;
1209+ pHost = NULL;
1210+ pData = (GETHOSTBYNAMEDATA*)lpParameter;
1211+ if(getaddrinfo(pData->name, NULL, NULL, &pAddr) == 0)
1212+ {
1213+ p = pAddr;
1214+ while(p)
1215+ {
1216+ if(p->ai_family == pData->Family)
1217+ {
1218+ switch(p->ai_family)
1219+ {
1220+ case AF_INET:
1221+ pHost = (struct hostent*)pData->buf;
1222+ if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr)
1223+ && p->ai_addrlen >= sizeof(struct sockaddr_in))
1224+ {
1225+ pHost->h_name = NULL;
1226+ pHost->h_aliases = NULL;
1227+ pHost->h_addrtype = p->ai_family;
1228+ pHost->h_length = sizeof(struct in_addr);
1229+ pHost->h_addr_list = (char**)(&pHost[1]);
1230+ pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);
1231+ pHost->h_addr_list[1] = NULL;
1232+ memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr));
1233+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));
1234+ }
1235+ else
1236+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));
1237+ break;
1238+ case AF_INET6:
1239+ pHost = (struct hostent*)pData->buf;
1240+ if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr)
1241+ && p->ai_addrlen >= sizeof(struct sockaddr_in6))
1242+ {
1243+ pHost->h_name = NULL;
1244+ pHost->h_aliases = NULL;
1245+ pHost->h_addrtype = p->ai_family;
1246+ pHost->h_length = sizeof(struct in6_addr);
1247+ pHost->h_addr_list = (char**)(&pHost[1]);
1248+ pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);
1249+ pHost->h_addr_list[1] = NULL;
1250+ memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr));
1251+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));
1252+ }
1253+ else
1254+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));
1255+ break;
1256+ }
1257+ }
1258+ if(pHost)
1259+ break;
1260+ p = p->ai_next;
1261+ }
1262+ if(!p)
1263+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));
1264+ freeaddrinfo(pAddr);
1265+ }
1266+ else
1267+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));
1268+ free(pData->name);
1269+ free(pData);
1270+ // CreateThreadが返すハンドルが重複するのを回避
1271+ Sleep(10000);
1272+ return 0;
1273+}
1274+
1275+// IPv6対応のWSAAsyncGetHostByName相当の関数
1276+// FamilyにはAF_INETまたはAF_INET6を指定可能
1277+// ただしANSI用
1278+static HANDLE WSAAsyncGetHostByNameIPv6(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)
1279+{
1280+ HANDLE hResult;
1281+ GETHOSTBYNAMEDATA* pData;
1282+ hResult = NULL;
1283+ if(pData = malloc(sizeof(GETHOSTBYNAMEDATA)))
1284+ {
1285+ pData->hWnd = hWnd;
1286+ pData->wMsg = wMsg;
1287+ if(pData->name = malloc(sizeof(char) * (strlen(name) + 1)))
1288+ {
1289+ strcpy(pData->name, name);
1290+ pData->buf = buf;
1291+ pData->buflen = buflen;
1292+ pData->Family = Family;
1293+ if(pData->h = CreateThread(NULL, 0, WSAAsyncGetHostByNameIPv6ThreadProc, pData, CREATE_SUSPENDED, NULL))
1294+ {
1295+ ResumeThread(pData->h);
1296+ hResult = pData->h;
1297+ }
1298+ }
1299+ }
1300+ if(!hResult)
1301+ {
1302+ if(pData)
1303+ {
1304+ if(pData->name)
1305+ free(pData->name);
1306+ free(pData);
1307+ }
1308+ }
1309+ return hResult;
1310+}
1311+
1312+// WSAAsyncGetHostByNameIPv6用のWSACancelAsyncRequest相当の関数
1313+int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle)
1314+{
1315+ int Result;
1316+ Result = SOCKET_ERROR;
1317+ if(TerminateThread(hAsyncTaskHandle, 0))
1318+ Result = 0;
1319+ return Result;
1320+}
1321+
11801322 // UTF-8対応
11811323
11821324 static BOOL ConvertStringToPunycode(LPSTR Output, DWORD Count, LPCSTR Input)
@@ -1279,3 +1421,16 @@ static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, c
12791421 return r;
12801422 }
12811423
1424+static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)
1425+{
1426+ HANDLE r = NULL;
1427+ char* pa0 = NULL;
1428+ if(pa0 = AllocateStringA(strlen(name) * 4))
1429+ {
1430+ if(ConvertNameToPunycode(pa0, name))
1431+ r = WSAAsyncGetHostByNameIPv6(hWnd, wMsg, pa0, buf, buflen, Family);
1432+ }
1433+ FreeDuplicatedString(pa0);
1434+ return r;
1435+}
1436+
--- a/socketwrapper.c
+++ b/socketwrapper.c
@@ -70,7 +70,7 @@ _X509_print_ex p_X509_print_ex;
7070 _X509_get_subject_name p_X509_get_subject_name;
7171 _X509_NAME_print_ex p_X509_NAME_print_ex;
7272
73-#define MAX_SSL_SOCKET 64
73+#define MAX_SSL_SOCKET 16
7474
7575 BOOL g_bOpenSSLLoaded;
7676 HMODULE g_hOpenSSL;