3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(VC++)特定のサーバに接続できるかどうかを調べる方法

要件は、前回の最初に書いた通りです。

今回はインターネットでマイクロソフトのサーバにつながる状態かどうかを調べる方法です。

実装は、CSocket クラスを用いることで、簡単にできるようです。

参考にさせてもらったのは、ソケット(バイトストリーム)を使用する(クライアント)です。

CSocket を使うために、MFC アプリケーションでないといけません。CSocket を使うにはMFCアプリケーションウィザードで、「Windowsソケット」にチェックを入れる必要あります。

それを忘れてた場合は、socketを使用するクラスに、afxsock.h をインクルードし(通常はstdafx.hに記述)、インスタンスの初期化 xxxxApp::InitInstance() の最初の方に、下記の記述を付け加えたらいいようです。

if (!AfxSocketInit())

{

AfxMessageBox(IDP_SOCKETS_INIT_FAILED);

return FALSE;

}

CSocket.Connect() で、サーバへのソケット接続ができたら、サーバにつながったことにします。

ソースは下記の通りです。接続できれば、true ,出来なければ false を返します。

/******************************************************************

Function Name: IsConnectNetwork

Description: 指定されたホストにたいして通信ができるかどうかを判断

Inputs: CString *msg 参照渡の文字列。メッセージを返す

Results: true 指定されたURL、ポートのホストにアクセスできた。

false アクセスできなかった

******************************************************************/

bool IsConnectNetwork(CString *msg)

{

BOOL bret;

 

// ソケットを作成

CSocket socket;

bret = socket.Create();

if( bret == FALSE)

{

//MessageBox(NULL, _T("ソケット作成失敗"), _T(""), MB_OK | MB_ICONINFORMATION );

*msg = "\n詳細:ソケット作成に失敗しました。";

return false;

}

 

CString strSv ;

strSv = "www.microsoft.com";

 

// サーバーへ接続する(ローカルを指定しています。)

bret = socket.Connect( ( strSv ), 80);

if( bret == FALSE)

{

//MessageBox(NULL, _T("サーバーへ接続失敗"), _T(""), MB_OK | MB_ICONINFORMATION );

*msg = "\n詳細:";

*msg += strSv ;

*msg += " に接続できませんでした。";

return false;

}

 

socket.Close();

 

return true;

}

その他の参考:

MFCソケット通信の基本 (クライアント編)