Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2011, 09:21   #1
CallBit
Новичок
Джуниор
 
Регистрация: 06.02.2011
Сообщений: 3
По умолчанию сканер портов

Хочу написать сканер портов,но что то не получается.Вот код:
Код:
#include "StdAfx.h"
#include <WinSock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
 
using namespace std;
int main()
{
  SOCKET sock;
  int error;
  char ws[1024];
  char buff[32];
  int MinPort;
  int MaxPort;
  int port;
 
 
  if(FAILED(WSAStartup(0x202,(WSADATA *)&ws[0])))
    {
           error = WSAGetLastError();
           cout << "WSAStartup error" << endl;
           return -1;
    }
//устанавливаем socket
 
        if(INVALID_SOCKET == (sock = socket(AF_INET,SOCK_STREAM,0)))
                {
                    error = WSAGetLastError();
                        cout << "Socket error" << endl;
                        return -1;
                }
                 sockaddr_in sock_addr;
                 ZeroMemory(&sock_addr, sizeof (sock_addr));
                 sock_addr.sin_family = AF_INET;
                 sock_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
 
  // Вводим Port
 
                 cout << "Enter the MinPort :" << endl;
                 cin >> MinPort;
                 cout << "Enter the MaxPort :" << endl;
                 cin >> MaxPort;
 
                 for(MinPort;MinPort <= MaxPort;MinPort++)
        {
                port = MinPort;
                sock_addr.sin_port = htons(port);
                if(SOCKET_ERROR == (connect(sock,(sockaddr *)&sock_addr,sizeof(sock_addr))))
                 {
                          error = WSAGetLastError();
                          cout << "Port " << port << " closed" << endl;
                 }
                else
                {
                        cout << "Port " << port << "Open" << endl;
                }
        }
                 
        system("PAUSE");
}
Всегда пишет,что все порты закрыты.В чём ошибка/недоработка?Подскажите пожалуйста.
Я новичок,не судите строго.
CallBit вне форума Ответить с цитированием
Старый 06.02.2011, 14:21   #2
CallBit
Новичок
Джуниор
 
Регистрация: 06.02.2011
Сообщений: 3
По умолчанию

Никто не знает?
CallBit вне форума Ответить с цитированием
Старый 06.02.2011, 21:22   #3
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

Код:
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;
}
программа под виндоус
Акоб вне форума Ответить с цитированием
Старый 06.02.2011, 21:35   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а что конкретно не работает? пробежался глазами по коду, вроде всё верно. По моему после каждого соединения в цикле, нужно закрывать сокет

Последний раз редактировалось NiCola999; 06.02.2011 в 21:39.
NiCola999 вне форума Ответить с цитированием
Старый 07.02.2011, 16:17   #5
CallBit
Новичок
Джуниор
 
Регистрация: 06.02.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
а что конкретно не работает? пробежался глазами по коду, вроде всё верно.
Он выдает всегда только 25 открытый и всё,и то это не верно.Блин хз че такое.
CallBit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканер портов Bat{CMD}_Men Операционные системы общие вопросы 1 28.08.2010 12:29
Сканер портов OPF_Nik Помощь студентам 5 03.02.2010 18:07
Сканер портов OPF_Nik Работа с сетью в Delphi 2 29.01.2010 19:26
Сканер портов One.Love Работа с сетью в Delphi 4 18.02.2008 16:05