掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
XP SP2適用後、ソケット通信に不具合について (ID:54551)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になっております。 mayumiです。 Windows XP SP2適用後、ソケット通信がうまく機能ができなくりました。 どのように直せばいいか検討がつかないので 投稿させて頂きました。 何か少しでも気がついた点がありましたら、 教えて頂けないでしょうか? 宜しくお願い致します。 開発環境 WindowsXP VC++6.0 以下がソースです。 ソースの内容は、サーバにアクセスし、PASVモードで ディレクトリ一覧を取得する。 BOOL SocketOpen(HWND ahWnd, LPCTSTR lpServName,LPCTSTR lpServUID,LPCTSTR lpServUPW) { int i; WORD wVersionRequested; int nErrorStatus; WSADATA wsaData; int soc; /* ソケット(Soket Descriptor) */ unsigned long serveraddr; /* サーバのIPアドレス */ struct hostent *serverhostent; /* サーバのホスト情報を指すポインタ */ struct sockaddr_in serversockaddr; /* サーバのアドレス */ char buf[MAX_PATH]; /* 受信するバッファ */ int buf_len; /* 受信したバイト数 */ char buf_sub[1024]; char szPort[8]; int port; int pos_start, pos_end; char *token; char seps[] = ","; int idx; int intPortFirst, intPortSecond; int list_count; int intfirst; /* WinSockの初期化を行う */ wVersionRequested = MAKEWORD(1, 1); /* バージョン 1.1 を要求する */ nErrorStatus = WSAStartup(wVersionRequested, &wsaData); if (atexit((void (*)(void))(WSACleanup))) { /* 終了時にWinSockのリソースを解放するようにしておく */ fprintf(stderr,"atexit(WSACleanup)失敗\n"); MessageBox(ahWnd,"FTPセッション(atexit)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } if ( nErrorStatus != 0 ) { fprintf(stderr,"WinSockの初期化失敗\n"); MessageBox(ahWnd,"FTPセッション(WinSock初期化)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* socにソケットを作成します */ soc = socket(PF_INET, SOCK_STREAM, 0); if(soc == INVALID_SOCKET){ fprintf(stderr,"ソケット作成失敗\n"); MessageBox(ahWnd,"FTPセッション(ソケット作成)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* svNameにドットで区切った10進数のIPアドレスが入っている場合、serveraddrに32bit整数のIPアドレスが返ります */ serveraddr = inet_addr((char*)lpServName); if (serveraddr == -1) { /* サーバ名(svName)からサーバのホスト情報を取得します */ serverhostent = gethostbyname(lpServName); if (serverhostent == NULL) { fprintf(stderr,"ホストアドレス取得失敗\n"); MessageBox(ahWnd,"FTPセッション(ホストアドレス取得)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ /* サーバのホスト情報からIPアドレスをserveraddrにコピーします */ serveraddr = *((unsigned long *)((serverhostent->h_addr_list)[0])); } } printf("ポート番号---"); strcpy(szPort, "21"); port = (int)atoi(szPort); /* サーバのアドレスの構造体にサーバのIPアドレスとポート番号を設定します */ serversockaddr.sin_family = AF_INET; /* インターネットの場合 */ serversockaddr.sin_addr.s_addr = serveraddr; /* サーバのIPアドレス */ serversockaddr.sin_port = htons((unsigned short)port); /* ポート番号 */ memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zero)); /* 指定のソケットでサーバへコネクトします */ if(connect(soc,(struct sockaddr *)&serversockaddr,sizeof(serversockaddr)) == SOCKET_ERROR){ fprintf(stderr,"サーバへの接続失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッションを確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } wsprintf( buf, "USER %s\r\n", lpServUID); /* 指定のソケットに文字列(buf)を送信します */ /* 送信した文字列はサーバに届きます */ if(send(soc, buf, lstrlen(buf), 0) == SOCKET_ERROR){ fprintf(stderr,"サーバへの送信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ送信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* ソケットから文字列を受信します */ /* 受信した文字列は buf に入ります */ /* 受信する文字列はサーバが送信したものです */ buf_len = recv(soc, buf, MAX_PATH - 1, 0); if (buf_len == SOCKET_ERROR ){ fprintf(stderr,"サーバからの受信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */ } wsprintf( buf, "PASS %s\r\n", lpServUPW); if(send(soc, buf, lstrlen(buf), 0) == SOCKET_ERROR){ fprintf(stderr,"サーバへの送信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ送信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } buf_len = recv(soc, buf, MAX_PATH - 1, 0); if (buf_len == SOCKET_ERROR ){ fprintf(stderr,"サーバからの受信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */ } lstrcpy(buf, ""); lstrcpy(buf, "PASV\r\n"); if(send(soc, buf, lstrlen(buf), 0) == SOCKET_ERROR){ fprintf(stderr,"サーバへの送信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ送信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } buf_len = recv(soc, buf, MAX_PATH - 1, 0); if (buf_len == SOCKET_ERROR ){ fprintf(stderr,"サーバからの受信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */ } lstrcpy(buf, ""); lstrcpy(buf, "LIST -lR\r\n"); if(send(soc, buf, lstrlen(buf), 0) == SOCKET_ERROR){ fprintf(stderr,"サーバへの送信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ送信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } buf_len = recv(soc, buf, MAX_PATH - 1, 0); if (buf_len == SOCKET_ERROR ){ fprintf(stderr,"サーバからの受信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */ } /* 送受信を無効にする */ shutdown(soc, 2); /* ソケットを破棄する */ closesocket(soc); WSACleanup(); pos_start = 0; pos_end = 0; pos_start = strcspn( buf, "(" ) + 1; pos_end = strcspn( buf, ")" ); pos_end = pos_end - pos_start; if (pos_end < 1) { MessageBox(ahWnd,"FTPセッション(PASS)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } strncpy( buf_sub, buf + pos_start, pos_end ); idx = 0; token = strtok( buf_sub, seps ); while( token != NULL ){ if (idx == 4) { intPortFirst = (int)atoi(token); } if (idx == 5) { intPortSecond = (int)atoi(token); } token = strtok( NULL, seps ); idx = idx + 1; } intPortFirst = intPortFirst * 256 + intPortSecond; /* WinSockの初期化を行う */ wVersionRequested = MAKEWORD(1, 1); /* バージョン 1.1 を要求する */ nErrorStatus = WSAStartup(wVersionRequested, &wsaData); if (atexit((void (*)(void))(WSACleanup))) { /* 終了時にWinSockのリソースを解放するようにしておく */ fprintf(stderr,"atexit(WSACleanup)失敗\n"); MessageBox(ahWnd,"FTPセッション(atexit)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } if ( nErrorStatus != 0 ) { fprintf(stderr,"WinSockの初期化失敗\n"); MessageBox(ahWnd,"FTPセッション(WinSock初期化)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* socにソケットを作成します */ soc = socket(PF_INET, SOCK_STREAM, 0); if(soc == INVALID_SOCKET){ fprintf(stderr,"ソケット作成失敗\n"); MessageBox(ahWnd,"FTPセッション(ソケット作成)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* svNameにドットで区切った10進数のIPアドレスが入っている場合、serveraddrに32bit整数のIPアドレスが返ります */ serveraddr = inet_addr((char*)lpServName); if (serveraddr == -1) { /* サーバ名(svName)からサーバのホスト情報を取得します */ serverhostent = gethostbyname(lpServName); if (serverhostent == NULL) { fprintf(stderr,"ホストアドレス取得失敗\n"); MessageBox(ahWnd,"FTPセッション(ホストアドレス取得)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); }else{ /* サーバのホスト情報からIPアドレスをserveraddrにコピーします */ serveraddr = *((unsigned long *)((serverhostent->h_addr_list)[0])); } } /* サーバのアドレスの構造体にサーバのIPアドレスとポート番号を設定します */ serversockaddr.sin_family = AF_INET; /* インターネットの場合 */ serversockaddr.sin_addr.s_addr = serveraddr; /* サーバのIPアドレス */ serversockaddr.sin_port = htons((unsigned short)intPortFirst); /* ポート番号 */ memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zero)); /* 指定のソケットでサーバへコネクトします */ if(connect(soc,(struct sockaddr *)&serversockaddr,sizeof(serversockaddr)) == SOCKET_ERROR){ fprintf(stderr,"サーバへの接続失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッションを確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } /* ソケットから文字列を受信します */ /* 受信した文字列は buf に入ります */ /* 受信する文字列はサーバが送信したものです */ intfirst = 0; list_count = 0; SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_RESETCONTENT,(WPARAM)0,(LPARAM)0); while (1) { buf_len = recv(soc, buf, MAX_PATH - 1, 0); if (buf_len == SOCKET_ERROR ){ fprintf(stderr,"サーバからの受信失敗\n"); shutdown(soc, 2); closesocket(soc); WSACleanup(); MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR); return(FALSE); } if ((buf_len == 0) || (buf_len == -1)) { break; } buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */ i = 0; while (buf_len > i) { if(buf[i] == '\r'){ if(buf[i+1] == '\n'){ i++; buf_sub[intfirst] = '\0'; if (list_count == 0) { idx = strspn( buf_sub, "total" ); if (idx == 5) { lstrcpy(buf_sub, ".:"); } } idx = strspn( buf_sub, "total" ); if (idx != 5) { idx = strspn( buf_sub, "d"); if (idx != 1) { SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)buf_sub); list_count++; } } intfirst = 0; } } else { buf_sub[intfirst] = buf[i]; intfirst++; } i++; } } /* 送受信を無効にする */ shutdown(soc, 2); /* ソケットを破棄する */ closesocket(soc); WSACleanup(); return(TRUE); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.