rendered paste bodyvoid CFastScanDlg::OnBnClickedButton1()
{
char tStr[255];
SOCKET sock[MAX_SOCKETS];
int busy[MAX_SOCKETS], port[MAX_SOCKETS];
int iStartPort, iEndPort, iBusySocks = 0;
struct sockaddr_in addr;
fd_set fdWaitSet;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
SetDlgItemText(IDC_STATUSTEXT, "Can't load WinSock");
return;
}
SetDlgItemText(IDC_STATUSTEXT, "Resolving host");
chStartPort.GetWindowText(tStr, 255);
iStartPort = atoi(tStr);
chEndPort.GetWindowText(tStr, 255);
iEndPort = atoi(tStr);
chHostName.GetWindowText(tStr, 255);
struct hostent *host=NULL;
host = gethostbyname(tStr);
if (host == NULL)
{
SetDlgItemText(IDC_STATUSTEXT,
"Unable to resolve host");
return;
}
for (int i = 0; i < MAX_SOCKETS; i++)
busy[i] = 0;
SetDlgItemText(IDC_STATUSTEXT, "Scanning");
while (((iBusySocks) || (iStartPort <= iEndPort)))
{
for (int i = 0; i < MAX_SOCKETS; i++)
{
if (busy[i] == 0 && iStartPort <= iEndPort)
{
sock[i] = socket (AF_INET,
SOCK_STREAM, IPPROTO_TCP);
if (sock[i] < 0)
{
SetDlgItemText(IDC_STATUSTEXT,
"Socket filed");
return;
}
iBusySocks++;
addr.sin_family = AF_INET;
addr.sin_port = htons (iStartPort);
CopyMemory(&addr.sin_addr, host->h_addr_list[0],
host->h_length);
ULONG ulBlock;
ulBlock = 1;
if (ioctlsocket(sock[i], FIONBIO, &ulBlock) ==
SOCKET_ERROR)
{
return;
}
connect(sock[i], (struct sockaddr *) &addr,
sizeof (addr));
if (WSAGetLastError() == WSAEINPROGRESS)
{
closesocket (sock[i]);
iBusySocks--;
}
else
{
busy[i] = 1;
port[i] = iStartPort;
}
iStartPort++;
}
}
FD_ZERO (&fdWaitSet);
for (int i = 0; i < MAX_SOCKETS; i++)
{
if (busy[i] == 1)
FD_SET (sock[i], &fdWaitSet);
}
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
if (select (1, NULL, &fdWaitSet, NULL, &tv) == SOCKET_ERROR)
{
SetDlgItemText(IDC_STATUSTEXT, "Select error");
return;
}
for (int i = 0; i < MAX_SOCKETS; i++)
{
if (busy[i] == 1)
{
if (FD_ISSET (sock[i], &fdWaitSet))
{
int opt;
int Len = sizeof(opt);
if (getsockopt(sock[i], SOL_SOCKET,
SO_ERROR, (char*)&opt, &Len) ==
SOCKET_ERROR)
SetDlgItemText(IDC_STATUSTEXT,
"getsockopt error");
if (opt == 0)
{
struct servent *tec;
itoa(port[i],tStr, 10);
strcat(tStr, " (");
tec = getservbyport(htons (port[i]),
"tcp");
if (tec==NULL)
strcat(tStr, "Unknown");
else
strcat(tStr, tec->s_name);
strcat(tStr, ") - open");
m_PortList.AddString(tStr);
busy[i] = 0;
shutdown(sock[i], SD_BOTH);
closesocket(sock[i]);
}
busy[i] = 0;
shutdown (sock[i], SD_BOTH);
closesocket (sock[i]);
iBusySocks--;
}
else
{
busy[i] = 0;
closesocket(sock[i]);
iBusySocks--;
}
}
}
ProcessMessages();
}
WSACleanup();
SetDlgItemText(IDC_STATUSTEXT, "Scaning complete");
return;
}