SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen);\r
int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOut, int *CancelCheckWork);\r
int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork);\r
+// 同時接続対応\r
+void RemoveReceivedData(SOCKET s);\r
int CheckClosedAndReconnect(void);\r
void CheckAllEventClosed(void);\r
\r
#if DBG_MSG\r
DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE");\r
#endif\r
- WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);\r
+ // Windows 2000でFD_WRITEが通知されないことがあるバグ修正\r
+ // 毎回通知されたのはNT 4.0までのバグであり仕様ではない\r
+ // XP以降は互換性のためか毎回通知される\r
+// WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE);\r
if(BackgrndMessageProc() == YES)\r
*CancelCheckWork = YES;\r
\r
// FTPS対応\r
// 送信バッファの空き確認には影響しないが念のため\r
// while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
- while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
- {\r
- if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)\r
- {\r
- Error = 1;\r
- break;\r
- }\r
-\r
- Sleep(1);\r
- if(BackgrndMessageProc() == YES)\r
- *CancelCheckWork = YES;\r
- else if(TimeOut != 0)\r
- {\r
- time(&ElapseTime);\r
- ElapseTime -= StartTime;\r
- if(ElapseTime >= TimeOut)\r
- {\r
- DoPrintf("do_write timed out");\r
- *TimeOutErr = YES;\r
- *CancelCheckWork = YES;\r
- }\r
- }\r
- }\r
+ // Windows 2000でFD_WRITEが通知されないことがあるバグ修正\r
+// while(!IsSSLAttached(s) && (*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES))\r
+// {\r
+// if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES)\r
+// {\r
+// Error = 1;\r
+// break;\r
+// }\r
+//\r
+// Sleep(1);\r
+// if(BackgrndMessageProc() == YES)\r
+// *CancelCheckWork = YES;\r
+// else if(TimeOut != 0)\r
+// {\r
+// time(&ElapseTime);\r
+// ElapseTime -= StartTime;\r
+// if(ElapseTime >= TimeOut)\r
+// {\r
+// DoPrintf("do_write timed out");\r
+// *TimeOutErr = YES;\r
+// *CancelCheckWork = YES;\r
+// }\r
+// }\r
+// }\r
\r
if((Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO))\r
{\r
}\r
\r
\r
+// 同時接続対応\r
+void RemoveReceivedData(SOCKET s)\r
+{\r
+ char buf[1024];\r
+ int len;\r
+ int Error;\r
+ while((len = recvS(s, buf, sizeof(buf), MSG_PEEK)) >= 0)\r
+ {\r
+ AskAsyncDone(s, &Error, FD_READ_BIT);\r
+ recvS(s, buf, len, 0);\r
+ }\r
+}\r
+\r
+\r
/*----- \r
*\r
* Parameter\r