開発環境 |
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