開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 chkport
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

chkport.c
// インポート ライブラリ
#pragma comment(lib, "ws2_32.lib")
 
#include <stdio.h>
#include <WinSock2.h>
 
int main(int argc, char* argv[])
{
	WSADATA		wsaData;
	HOSTENT*	phe;
	SOCKET		sock = INVALID_SOCKET;
	SOCKADDR_IN	name;
	char*		pcHost;
	int		iPort;
	int		iRet;
	int		iFlgStartup = 0;
	int		iFlgConnect = 0;
	int		iErrLv = 2;	// 異常終了
 
	if (argc != 3) {
		fprintf(stderr, "usage: chkport host port\n");
		goto Exit;
	}
	pcHost = argv[1];
	iPort = atoi(argv[2]);
 
	// WinSockDLLの初期化
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iRet != 0) {
		printf("error: WSAStartup:%d\n", iRet);
		goto Exit;
	}
	iFlgStartup = 1;
 
	// IPアドレスの取得
	phe = gethostbyname(pcHost);
	if (phe == NULL) {
		fprintf(stderr, "IPアドレスの取得に失敗しました。[%s]\n", pcHost);
		goto Exit;
	}
 
	// TCPソケット記述子の作成
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == INVALID_SOCKET) {
		fprintf(stderr, "error: socket\n");
		goto Exit;
	}
 
	// サーバーに接続
	name.sin_family	= AF_INET;
	name.sin_port	= htons(iPort);
	name.sin_addr	= *((IN_ADDR*)phe->h_addr);
	iRet = connect(sock, (SOCKADDR*)&name, sizeof name);
	if (iRet != 0) {
		printf("サーバーへの接続に失敗しました。\n");
		iErrLv = 1;	// サーバーへの接続に失敗
		goto Exit;
	}
	iFlgConnect = 1;
 
	printf("サーバーへの接続に成功しました。\n");
	iErrLv = 0;	// 正常終了
Exit:
	if (iFlgConnect) {
		shutdown(sock, SD_BOTH);
	}
	if (sock != INVALID_SOCKET) {
		closesocket(sock);
	}
	if (iFlgStartup) {
		WSACleanup();
	}
	return iErrLv;
}
 

出力
C:\>chkport localhost 2222
サーバーへの接続に成功しました。
C:\>echo %errorlevel%
0
C:\>chkport localhost 2222
サーバーへの接続に失敗しました。
C:\>echo %errorlevel%
1
C:\>chkport hoge 2222
IPアドレスの取得に失敗しました。[hoge]
C:\>echo %errorlevel%
2

test.bat
@echo off
 
:loop
chkport localhost 2222
if errorlevel 2 goto exit
if errorlevel 1 goto connrefused
goto exit
 
:connrefused
sleep 5
goto loop
 
:exit
pause
 
最終更新:2012年09月01日 16:50