#include "stdlib.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
SOCKET g_socket;
ULONG g_timeout;
sockaddr_in g_addrLocal;
sockaddr_in g_addrRemote;
void help()
{
printf("Connection checking test programm.\n\n");
printf("TEST -r remote_address [-p port_no] [-l local_address] [-t timeout]\n");
printf("-r remote_address remote server address\n");
printf("-p port_no remote server port address\n");
printf("-l local_address local IP address\n");
printf("-t timeout connection waiting timeout in milliseconds\n\n");
printf("sample :\n");
printf("TEST -r www.microsoft.com -p 80 -l 195.128.0.1 -t 2000\n\n");
}
void Init()
{
WSADATA wd;
WSAStartup(MAKEWORD(2, 2), &wd);
g_socket = INVALID_SOCKET;
g_timeout= 0xFFFFFFFF;
memset(&g_addrLocal, 0, sizeof(sockaddr_in));
memset(&g_addrRemote, 0, sizeof(sockaddr_in));
g_addrRemote.sin_addr.s_addr = INADDR_NONE;
g_addrRemote.sin_family = AF_INET;
g_addrLocal.sin_addr.s_addr = INADDR_NONE;
g_addrLocal.sin_family = AF_INET;
}
void Exit()
{
WSACleanup();
if (g_socket != INVALID_SOCKET) {
closesocket(g_socket);
g_socket = INVALID_SOCKET;
}
}
BOOL GetAddress(char* szAddress, sockaddr_in *sockAddr)
{
if (szAddress == NULL|sockAddr == NULL)
return NULL;
ULONG nAddr = inet_addr(szAddress);
if (nAddr == INADDR_NONE) {
hostent *host = gethostbyname(szAddress);
if (host == NULL)
return FALSE;
nAddr = *((ULONG *)host->h_addr);
}
sockAddr->sin_addr.s_addr = nAddr;
return(nAddr != INADDR_NONE);
}
BOOL ValidateArgs(int argc, char* argv[])
{
if (argc < 3)
return FALSE;
char *szRemoteAddr = NULL;
char *szLocalAddr = NULL;
char *port = NULL;
char *timeout = NULL;
char *pch;
for (int i = 1; i < argc; i ++) {
pch = argv[i];
if (*pch == '-'|*pch == '/') {
pch ++;
switch (*pch) {
case 'r':
szRemoteAddr = argv[i + 1];
if (*szRemoteAddr != '-' && *szRemoteAddr != '/') {
i ++;
if (!GetAddress(szRemoteAddr, &g_addrRemote))
return FALSE;
}
break;
case 'p':
port = argv[i + 1];
if (*port != '-' && *port != '/') {
i ++;
g_addrRemote.sin_port = htons((u_short)atoi(port));
}
break;
case 'l':
szLocalAddr = argv[i + 1];
if (*szLocalAddr != '-' && *szLocalAddr != '/') {
i ++;
if (!GetAddress(szLocalAddr, &g_addrLocal))
return FALSE;
}
break;
case 't':
timeout = argv[i + 1];
if (*timeout != '-' && *timeout != '/') {
i ++;
g_timeout = (u_long)atol(timeout);
}
break;
default:
return FALSE;
}
}
}
if (g_addrRemote.sin_port == 0)
g_addrRemote.sin_port = htons(80);
return(g_addrRemote.sin_addr.s_addr != INADDR_NONE);
}
BOOL CreateSocket()
{
g_socket = socket(AF_INET, SOCK_STREAM, 0);
if (g_addrLocal.sin_addr.s_addr != INADDR_NONE)
return(bind(g_socket, (sockaddr*)&g_addrLocal, sizeof(sockaddr_in)) != SOCKET_ERROR);
else
return(g_socket != INVALID_SOCKET);
}
BOOL Connect()
{
if (g_socket == INVALID_SOCKET)
return FALSE;
u_long block = 1;
if (ioctlsocket(g_socket, FIONBIO, &block) == SOCKET_ERROR)
return FALSE;
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(g_socket, &writefds);
TIMEVAL timeout = {(long)(g_timeout / 1000), (long)(g_timeout - (g_timeout / 1000) * 1000)};
int err;
connect(g_socket, (sockaddr*)&g_addrRemote, sizeof(sockaddr_in));
err = select(0, NULL, &writefds, NULL, g_timeout != 0xFFFFFFFF ? &timeout : NULL);
if (err == SOCKET_ERROR)
return FALSE;
else if (err == 0)
printf("connetion is not established, due timeout.\n");
else
printf("connection establised\n");
return TRUE;
}
int main(int argc, char* argv[])
{
Init();
if (!ValidateArgs(argc, argv))
help();
else if (!CreateSocket()|!Connect())
printf("error established during programm running.\n");
Exit();
printf("\npress any key to exit programm.\n");
getchar();
return 0;
}
---
|