X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=socket.c;h=1da9215b9837330adbb9d79efb0c7ecea55f038a;hp=db7b69f34feed3c8f30855e4485761c30b5696e5;hb=eb4bba58018c0bb08e8564600c2c66257c3a3077;hpb=190e1b19f7b48bbf636b2a0a5e7b71d01929def5 diff --git a/socket.c b/socket.c index db7b69f..1da9215 100644 --- a/socket.c +++ b/socket.c @@ -66,6 +66,11 @@ typedef struct { int FdRead; int FdWrite; int Error; + // ソケットにデータを付与 + struct sockaddr_in HostAddrIPv4; + struct sockaddr_in SocksAddrIPv4; + struct sockaddr_in6 HostAddrIPv6; + struct sockaddr_in6 SocksAddrIPv6; } ASYNCSIGNAL; @@ -91,10 +96,10 @@ typedef struct { static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); static int AskAsyncDone(SOCKET s, int *Error, int Mask); static int AskAsyncDoneDbase(HANDLE Async, int *Error); -static int RegistAsyncTable(SOCKET s); -static int RegistAsyncTableDbase(HANDLE Async); -static int UnRegistAsyncTable(SOCKET s); -static int UnRegistAsyncTableDbase(HANDLE Async); +static int RegisterAsyncTable(SOCKET s); +static int RegisterAsyncTableDbase(HANDLE Async); +static int UnregisterAsyncTable(SOCKET s); +static int UnregisterAsyncTableDbase(HANDLE Async); /*===== 外部参照 =====*/ @@ -275,7 +280,7 @@ static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LP case WM_ASYNC_DBASE : // APIの仕様上ハンドルが登録される前にウィンドウメッセージが呼び出される可能性あり - RegistAsyncTableDbase((HANDLE)wParam); + RegisterAsyncTableDbase((HANDLE)wParam); // スレッド衝突のバグ修正 WaitForSingleObject(hAsyncTblAccMutex, INFINITE); for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++) @@ -450,7 +455,7 @@ static int AskAsyncDoneDbase(HANDLE Async, int *Error) * *----------------------------------------------------------------------------*/ -static int RegistAsyncTable(SOCKET s) +static int RegisterAsyncTable(SOCKET s) { int Sts; int Pos; @@ -489,6 +494,11 @@ static int RegistAsyncTable(SOCKET s) Signal[Pos].FdAccept = 0; Signal[Pos].FdRead = 0; Signal[Pos].FdWrite = 0; + // ソケットにデータを付与 + memset(&Signal[Pos].HostAddrIPv4, 0, sizeof(struct sockaddr_in)); + memset(&Signal[Pos].SocksAddrIPv4, 0, sizeof(struct sockaddr_in)); + memset(&Signal[Pos].HostAddrIPv6, 0, sizeof(struct sockaddr_in6)); + memset(&Signal[Pos].SocksAddrIPv6, 0, sizeof(struct sockaddr_in6)); Sts = YES; break; } @@ -516,7 +526,7 @@ static int RegistAsyncTable(SOCKET s) * *----------------------------------------------------------------------------*/ -static int RegistAsyncTableDbase(HANDLE Async) +static int RegisterAsyncTableDbase(HANDLE Async) { int Sts; int Pos; @@ -578,7 +588,7 @@ static int RegistAsyncTableDbase(HANDLE Async) * *----------------------------------------------------------------------------*/ -static int UnRegistAsyncTable(SOCKET s) +static int UnregisterAsyncTable(SOCKET s) { int Sts; int Pos; @@ -613,7 +623,7 @@ static int UnRegistAsyncTable(SOCKET s) * *----------------------------------------------------------------------------*/ -static int UnRegistAsyncTableDbase(HANDLE Async) +static int UnregisterAsyncTableDbase(HANDLE Async) { int Sts; int Pos; @@ -639,6 +649,104 @@ static int UnRegistAsyncTableDbase(HANDLE Async) } +// ソケットにデータを付与 + +int SetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks) +{ + int Sts; + int Pos; + + WaitForSingleObject(hAsyncTblAccMutex, INFINITE); + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + if(Host != NULL) + memcpy(&Signal[Pos].HostAddrIPv4, Host, sizeof(struct sockaddr_in)); + if(Socks != NULL) + memcpy(&Signal[Pos].SocksAddrIPv4, Socks, sizeof(struct sockaddr_in)); + Sts = YES; + break; + } + } + ReleaseMutex(hAsyncTblAccMutex); + + return(Sts); +} + +int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks) +{ + int Sts; + int Pos; + + WaitForSingleObject(hAsyncTblAccMutex, INFINITE); + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + if(Host != NULL) + memcpy(&Signal[Pos].HostAddrIPv6, Host, sizeof(struct sockaddr_in6)); + if(Socks != NULL) + memcpy(&Signal[Pos].SocksAddrIPv6, Socks, sizeof(struct sockaddr_in6)); + Sts = YES; + break; + } + } + ReleaseMutex(hAsyncTblAccMutex); + + return(Sts); +} + +int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks) +{ + int Sts; + int Pos; + + WaitForSingleObject(hAsyncTblAccMutex, INFINITE); + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + if(Host != NULL) + memcpy(Host, &Signal[Pos].HostAddrIPv4, sizeof(struct sockaddr_in)); + if(Socks != NULL) + memcpy(Socks, &Signal[Pos].SocksAddrIPv4, sizeof(struct sockaddr_in)); + Sts = YES; + break; + } + } + ReleaseMutex(hAsyncTblAccMutex); + + return(Sts); +} + +int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks) +{ + int Sts; + int Pos; + + WaitForSingleObject(hAsyncTblAccMutex, INFINITE); + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + if(Host != NULL) + memcpy(Host, &Signal[Pos].HostAddrIPv6, sizeof(struct sockaddr_in6)); + if(Socks != NULL) + memcpy(Socks, &Signal[Pos].SocksAddrIPv6, sizeof(struct sockaddr_in6)); + Sts = YES; + break; + } + } + ReleaseMutex(hAsyncTblAccMutex); + + return(Sts); +} + @@ -666,7 +774,7 @@ struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int * hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); if(hAsync != NULL) { - RegistAsyncTableDbase(hAsync); + RegisterAsyncTableDbase(hAsync); while((*CancelCheckWork == NO) && (AskAsyncDoneDbase(hAsync, &Error) != YES)) { Sleep(1); @@ -682,7 +790,7 @@ struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int * { Ret = (struct hostent *)Buf; } - UnRegistAsyncTableDbase(hAsync); + UnregisterAsyncTableDbase(hAsync); } return(Ret); #else @@ -710,7 +818,7 @@ struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int * hAsync = WSAAsyncGetHostByNameIPv6M(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len, AF_INET6); if(hAsync != NULL) { - RegistAsyncTableDbase(hAsync); + RegisterAsyncTableDbase(hAsync); while((*CancelCheckWork == NO) && (AskAsyncDoneDbase(hAsync, &Error) != YES)) { Sleep(1); @@ -720,13 +828,13 @@ struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int * if(*CancelCheckWork == YES) { - WSACancelAsyncRequest(hAsync); + WSACancelAsyncRequestIPv6(hAsync); } else if(Error == 0) { Ret = (struct hostent *)Buf; } - UnRegistAsyncTableDbase(hAsync); + UnregisterAsyncTableDbase(hAsync); } return(Ret); #else @@ -745,7 +853,7 @@ SOCKET do_socket(int af, int type, int protocol) Ret = socket(af, type, protocol); if(Ret != INVALID_SOCKET) { - RegistAsyncTable(Ret); + RegisterAsyncTable(Ret); } #if DBG_MSG DoPrintf("# do_socket (S=%x)", Ret); @@ -769,7 +877,7 @@ int do_closesocket(SOCKET s) // スレッド衝突のバグ修正 WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, 0); - UnRegistAsyncTable(s); + UnregisterAsyncTable(s); // FTPS対応 // Ret = closesocket(s); Ret = FTPS_closesocket(s); @@ -792,7 +900,7 @@ int do_closesocket(SOCKET s) if(BackgrndMessageProc() == YES) CancelCheckWork = YES; // スレッド衝突のバグ修正 -// UnRegistAsyncTable(s); +// UnregisterAsyncTable(s); #if DBG_MSG DoPrintf("# Exit close"); @@ -929,8 +1037,10 @@ SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen) DoPrintf("## do_sccept (S=%x)", Ret2); DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); #endif - RegistAsyncTable(Ret2); - if(WSAAsyncSelect(Ret2, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE) == SOCKET_ERROR) + RegisterAsyncTable(Ret2); + // 高速化のためFD_READとFD_WRITEを使用しない +// if(WSAAsyncSelect(Ret2, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE) == SOCKET_ERROR) + if(WSAAsyncSelect(Ret2, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT) == SOCKET_ERROR) { do_closesocket(Ret2); Ret2 = INVALID_SOCKET; @@ -1190,10 +1300,10 @@ void RemoveReceivedData(SOCKET s) { char buf[1024]; int len; - int Error; - while((len = FTPS_recv(s, buf, sizeof(buf), MSG_PEEK)) >= 0) +// int Error; + while((len = FTPS_recv(s, buf, sizeof(buf), MSG_PEEK)) > 0) { - AskAsyncDone(s, &Error, FD_READ); +// AskAsyncDone(s, &Error, FD_READ); FTPS_recv(s, buf, len, 0); } } @@ -1225,3 +1335,19 @@ int CheckClosedAndReconnect(void) +// 同時接続対応 +int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) +{ + int Error; + int Sts; + +//SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + + Sts = FFFTP_SUCCESS; + if(AskAsyncDone(*Skt, &Error, FD_CLOSE) == YES) + { + Sts = ReConnectTrnSkt(Skt, CancelCheckWork); + } + return(Sts); +} +