2013-08-13 3 views
0

Я написал простой код сканера портов, чтобы узнать, доступен ли хост или нет, установив соединение сокета. Логика заключается в проверке соединения, если соединение установлено успешно, тогда хост, или если мы получим код ошибки WSACONNREFUSED, тогда хост присутствует. Соединение сокета является блокирующим, и если на этом IP-адресе нет хоста, программа будет заблокирована до тех пор, пока не произойдет тайм-аут. Я прочитал несколько примеров в Интернете о том, как использовать неблокирующий сокет, но они используют чтение и запись, чтобы проверить, можем ли мы писать на сервер или читать с серверной стороны, чтобы установить соединение. И для этого должно быть серверный код для принятия. Есть ли способ изменить существующий код для портального сканера, используя неблокирующий сокет, так как я хочу, чтобы настоящее приложение работало немного быстрее, любые полезные советы были бы полезны.Использование гнезда для блокировки в сканере портов

Настоящий код приведен ниже.

#ifndef UNICODE 
#define UNICODE 
#endif 

#define WIN32_LEAN_AND_MEAN 

#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 

// Need to link with Ws2_32.lib 
#pragma comment(lib, "ws2_32.lib") 

int port[]={80,139}; 

int wmain() 
{ 

    // Initialize Winsock 
    WSADATA wsaData; 
    int i=0,flag=0; 
    char ip[20]; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != NO_ERROR) { 
    wprintf(L"WSAStartup function failed with error: %d\n", iResult); 
    return 1; 
    } 
    SOCKET ConnectSocket; 
    sockaddr_in clientService; 

// Create a SOCKET for connecting to server 

    ConnectSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if (ConnectSocket == INVALID_SOCKET) { 
    wprintf(L"socket function failed with error: %ld\n", WSAGetLastError()); 
    WSACleanup(); 
    return 1; 
} 

// The sockaddr_in structure specifies the address family, 
// IP address, and port of the server to be connected to. 

printf("\n Enter the Ip Address : "); 
scanf("%s",ip); 

clientService.sin_family = AF_INET; 
clientService.sin_addr.S_un.S_addr = inet_addr(ip); 


for(i=0;i<2;i++) 
{ 
    clientService.sin_port = htons((unsigned short)port[i]); 
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService)); 

    if((iResult==0)||((iResult=WSAGetLastError())==WSAECONNREFUSED)) 
    { 
    printf(" %d ",iResult); 
    printf("\n Port Number : %d",port[i]); 
    printf("\n Machine Found "); 
    flag=1; 
    break; 
    } 
} 

if(flag==0) 
{ 
    printf("\n Machine not found "); 
} 

iResult = closesocket(ConnectSocket); 
if (iResult == SOCKET_ERROR) { 
    wprintf(L"closesocket function failed with machine %d error: %ld\n",i, WSAGetLastError()); 
    WSACleanup(); 
    return 1; 
} 

WSACleanup(); 
return 0; 
} 

ответ

2

После выполнения нелипкой connect(), сокета станет доступен для записи, когда Connect завершается. В этот момент вы должны проверить SO_LASTERROR на сокете, чтобы узнать, успешно ли установлено соединение.

+0

Так что мне нужно запустить цикл, чтобы проверить SO_LASTERROR, чтобы узнать, завершено ли оно? – blitz

+0

Мне непонятно, хотите ли вы попросить меня повторить себя безвозмездно или действительно ли что-то выше вас не понимало. – EJP

+0

Я понял это так, что мне нужно сделать повторяющиеся циклы, чтобы проверить SO_LASTEROR, чтобы узнать, успешно ли соединение. Пожалуйста, исправьте меня, если я ошибаюсь. – blitz

Смежные вопросы