FFFTPのソースコードです。
Revision | fad6e7c3240d47608cb07f6f2304e1e5091f995a (tree) |
---|---|
Zeit | 2011-11-01 21:53:00 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of receiving data on Windows 2000.
Enhance routines for canceling or aborting.
@@ -1719,6 +1719,8 @@ int do_listen(SOCKET s, int backlog); | ||
1719 | 1719 | SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen); |
1720 | 1720 | int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOut, int *CancelCheckWork); |
1721 | 1721 | int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork); |
1722 | +// 同時接続対応 | |
1723 | +void RemoveReceivedData(SOCKET s); | |
1722 | 1724 | int CheckClosedAndReconnect(void); |
1723 | 1725 | void CheckAllEventClosed(void); |
1724 | 1726 |
@@ -832,6 +832,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA | ||
832 | 832 | switch (message) |
833 | 833 | { |
834 | 834 | case WM_COMMAND : |
835 | + // 同時接続対応 | |
836 | + // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない | |
837 | + if(CancelFlg == YES) | |
838 | + RemoveReceivedData(AskCmdCtrlSkt()); | |
835 | 839 | switch(LOWORD(wParam)) |
836 | 840 | { |
837 | 841 | case MENU_CONNECT : |
@@ -1046,36 +1046,40 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int | ||
1046 | 1046 | #if DBG_MSG |
1047 | 1047 | DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); |
1048 | 1048 | #endif |
1049 | - WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); | |
1049 | + // Windows 2000でFD_WRITEが通知されないことがあるバグ修正 | |
1050 | + // 毎回通知されたのはNT 4.0までのバグであり仕様ではない | |
1051 | + // XP以降は互換性のためか毎回通知される | |
1052 | +// WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); | |
1050 | 1053 | if(BackgrndMessageProc() == YES) |
1051 | 1054 | *CancelCheckWork = YES; |
1052 | 1055 | |
1053 | 1056 | // FTPS対応 |
1054 | 1057 | // 送信バッファの空き確認には影響しないが念のため |
1055 | 1058 | // while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) |
1056 | - while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) | |
1057 | - { | |
1058 | - if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) | |
1059 | - { | |
1060 | - Error = 1; | |
1061 | - break; | |
1062 | - } | |
1063 | - | |
1064 | - Sleep(1); | |
1065 | - if(BackgrndMessageProc() == YES) | |
1066 | - *CancelCheckWork = YES; | |
1067 | - else if(TimeOut != 0) | |
1068 | - { | |
1069 | - time(&ElapseTime); | |
1070 | - ElapseTime -= StartTime; | |
1071 | - if(ElapseTime >= TimeOut) | |
1072 | - { | |
1073 | - DoPrintf("do_write timed out"); | |
1074 | - *TimeOutErr = YES; | |
1075 | - *CancelCheckWork = YES; | |
1076 | - } | |
1077 | - } | |
1078 | - } | |
1059 | + // Windows 2000でFD_WRITEが通知されないことがあるバグ修正 | |
1060 | +// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) | |
1061 | +// { | |
1062 | +// if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) | |
1063 | +// { | |
1064 | +// Error = 1; | |
1065 | +// break; | |
1066 | +// } | |
1067 | +// | |
1068 | +// Sleep(1); | |
1069 | +// if(BackgrndMessageProc() == YES) | |
1070 | +// *CancelCheckWork = YES; | |
1071 | +// else if(TimeOut != 0) | |
1072 | +// { | |
1073 | +// time(&ElapseTime); | |
1074 | +// ElapseTime -= StartTime; | |
1075 | +// if(ElapseTime >= TimeOut) | |
1076 | +// { | |
1077 | +// DoPrintf("do_write timed out"); | |
1078 | +// *TimeOutErr = YES; | |
1079 | +// *CancelCheckWork = YES; | |
1080 | +// } | |
1081 | +// } | |
1082 | +// } | |
1079 | 1083 | |
1080 | 1084 | if((Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO)) |
1081 | 1085 | { |
@@ -1133,6 +1137,20 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int | ||
1133 | 1137 | } |
1134 | 1138 | |
1135 | 1139 | |
1140 | +// 同時接続対応 | |
1141 | +void RemoveReceivedData(SOCKET s) | |
1142 | +{ | |
1143 | + char buf[1024]; | |
1144 | + int len; | |
1145 | + int Error; | |
1146 | + while((len = recvS(s, buf, sizeof(buf), MSG_PEEK)) >= 0) | |
1147 | + { | |
1148 | + AskAsyncDone(s, &Error, FD_READ_BIT); | |
1149 | + recvS(s, buf, len, 0); | |
1150 | + } | |
1151 | +} | |
1152 | + | |
1153 | + | |
1136 | 1154 | /*----- |
1137 | 1155 | * |
1138 | 1156 | * Parameter |