2013-08-13 5 views
0

간단한 소켓 스캐너 코드를 작성하여 소켓 연결을 설정하여 호스트를 사용할 수 있는지 여부를 확인할 수 있습니다. 논리는 연결이 성공하면 연결을 확인하는 것입니다. 호스트가 사용 가능하거나 아니면 에러 코드가 WSACONNREFUSED이면 호스트가 존재합니다. 소켓 연결은 블로킹이며, 해당 IP 주소에 호스트가 없으면 시간 초과가 발생할 때까지 프로그램이 차단됩니다. 인터넷에서 블로킹 소켓을 사용하지 않는 방법에 대한 몇 가지 예제를 읽었지 만, 서버 측에 쓰거나 서버 측에서 읽을 수 있는지 여부를 확인하기 위해 읽기 및 쓰기를 사용하여 연결을 설정합니다. 서버 코드를 받아 들일 수 있습니다. 비 블로킹 소켓을 사용하여 포트 스캐너의 기존 코드를 수정할 수있는 방법이 있습니다. 현재 응용 프로그램을 조금 더 빠르게 실행하려면 유용한 팁이 유용 할 것입니다.포트 스캐너의 비 차단 소켓 사용

현재 코드는 다음과 같습니다. 비 블로킹 connect(), 소켓을 수행 한 후

#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

이 때 연결이 완료 쓰기 될 것입니다. 이 때 소켓에서 SO_LASTERROR을 확인하여 연결이 성공적으로 완료되었는지 확인해야합니다.

+0

그래서 완료되었는지 여부를 확인하기 위해 SO_LASTERROR를 확인하기 위해 루프를 실행해야합니까? – blitz

+0

당신이 나에게 무의식적으로 반복하도록 요구하고 있는지 또는 정말로 당신이 이해하지 못하는 부분이 있는지 여부는 분명하지 않습니다. – EJP

+0

나는이 방법을 이해했다. 연결이 성공했는지 확인하기 위해 SO_LASTEROR를 확인하기 위해 반복 된 루프를 만들어야한다. 내가 틀렸다면 나를 바로 잡으세요. – blitz