All pastes #673342 Raw Edit

Untitled

public text v1 · immutable
#673342 ·published 2007-08-28 10:13 UTC
rendered paste body
void 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;
}