#include <string.h>\r
#include <mbstring.h>\r
#include <time.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
#include <process.h>\r
free(Pos);\r
}\r
NewCmdSkt = AskCmdCtrlSkt();\r
- if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
+ if(AskReuseCmdSkt() == YES && ThreadCount == 0)\r
{\r
- if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
+ if(TransPacketBase && ThreadCount < AskMaxThreadCount())\r
+ TrnSkt = AskTrnCtrlSkt();\r
+ }\r
+ else\r
+ {\r
+ if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
{\r
- ReleaseMutex(hListAccMutex);\r
- ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
- // 同時ログイン数制限に引っかかった可能性あり\r
- // 負荷を下げるためにしばらく待機\r
- if(TrnSkt == INVALID_SOCKET)\r
+ if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
{\r
- i = 10000;\r
- while(NewCmdSkt != CmdSkt && i > 0)\r
+ ReleaseMutex(hListAccMutex);\r
+ ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+ // 同時ログイン数制限に引っかかった可能性あり\r
+ // 負荷を下げるためにしばらく待機\r
+ if(TrnSkt == INVALID_SOCKET)\r
+ {\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
- i--;\r
}\r
}\r
-// WaitForSingleObject(hListAccMutex, INFINITE);\r
- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
- {\r
- BackgrndMessageProc();\r
- Sleep(1);\r
- }\r
}\r
- }\r
- else\r
- {\r
- if(TrnSkt != INVALID_SOCKET)\r
+ else\r
{\r
- ReleaseMutex(hListAccMutex);\r
- DoClose(TrnSkt);\r
- TrnSkt = INVALID_SOCKET;\r
-// WaitForSingleObject(hListAccMutex, INFINITE);\r
- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ if(TrnSkt != INVALID_SOCKET)\r
{\r
- BackgrndMessageProc();\r
- Sleep(1);\r
+ ReleaseMutex(hListAccMutex);\r
+ SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
+ DoClose(TrnSkt);\r
+ TrnSkt = INVALID_SOCKET;\r
+// WaitForSingleObject(hListAccMutex, INFINITE);\r
+ while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ {\r
+ BackgrndMessageProc();\r
+ Sleep(1);\r
+ }\r
}\r
}\r
}\r
// else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0)\r
else if(strcmp(Pos->Cmd, "SETCUR") == 0)\r
{\r
- if(AskShareProh() == YES)\r
+// if(AskShareProh() == YES)\r
+ if(AskReuseCmdSkt() == NO || AskShareProh() == YES)\r
{\r
// if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
if(strcmp(CurDir[Pos->ThreadCount], Pos->RemoteFile) != 0)\r
// else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0)\r
else if(strcmp(Pos->Cmd, "BACKCUR") == 0)\r
{\r
- if(AskShareProh() == NO)\r
+// if(AskShareProh() == NO)\r
+ if(AskReuseCmdSkt() == YES && AskShareProh() == NO)\r
{\r
// if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
// CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile);\r
Sleep(100);\r
}\r
}\r
- if(TrnSkt != INVALID_SOCKET)\r
- DoClose(TrnSkt);\r
+ if(AskReuseCmdSkt() == NO || ThreadCount > 0)\r
+ {\r
+ if(TrnSkt != INVALID_SOCKET)\r
+ {\r
+ SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
+ DoClose(TrnSkt);\r
+ }\r
+ }\r
return 0;\r
}\r
\r
}\r
\r
\r
+// IPv6対応\r
+static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family)\r
+{\r
+ char *Pos;\r
+ char *Btm;\r
+ int Sts;\r
+\r
+ Sts = FFFTP_FAIL;\r
+\r
+ Pos = strchr(Str, '|');\r
+ if(Pos != NULL)\r
+ {\r
+ Pos++;\r
+ Btm = strchr(Pos, '|');\r
+ if(Btm != NULL)\r
+ {\r
+ switch(atoi(Pos))\r
+ {\r
+ case 1:\r
+ *Family = AF_INET;\r
+ break;\r
+ case 2:\r
+ *Family = AF_INET6;\r
+ break;\r
+ }\r
+ Pos = Btm + 1;\r
+ Btm = strchr(Pos, '|');\r
+ if(Btm != NULL)\r
+ {\r
+ if((Btm - Pos) <= Max)\r
+ {\r
+ if((Btm - Pos) > 0)\r
+ {\r
+ strncpy(Adrs, Pos, Btm - Pos);\r
+ *(Adrs + (Btm - Pos)) = NUL;\r
+ }\r
+\r
+ Pos = Btm + 1;\r
+ Btm = strchr(Pos, '|');\r
+ if(Btm != NULL)\r
+ {\r
+ Btm++;\r
+ *Port = atoi(Pos);\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return(Sts);\r
+}\r
+\r
+\r
/*----- Windowsのスペシャルデバイスかどうかを返す -----------------------------\r
*\r
* Parameter\r