|
임양규님 답변 주셔서 감사합니다.
그런데, 제 질문의 의도와는 좀 벗어난 답변을 주셨군요^^;
제 질문은 개인방화벽처럼 모든 통신 Port를 감시하는 기능을 질문한 것인데요.
즉, 임양규님의 소스는 해당 프로그램의 통신연결에 관한 IP를 알 수 있는 것이고 다른 프로그램이 접속하고 있는 통신Port는 검사하지 못하는데, 저는 이것을 하고 싶다는 질문이었습니다.
이것을 위해 저는 모든 port를 scan하는 방법을 사용하였는데 이 방법은 주로 해킹에 사용되는 방법입니다. 게다가 단순히 port의 connect상태만을 검사하기 때문에 자세한 정보는 모른다는 단점도 가지고 있습니다.
핵심 소스는 다음과 같습니다.
PortScan(void* lpv)
{
char szMessage[1024];
char szIp[20];
SOCKET fd;
struct sockaddr_in addr;
int i;
TVINSERTSTRUCT TI;
HTREEITEM Node;
HWND hTree;
wsprintf( szIp, "%s", gszIpAddr );
hTree = GetDlgItem( hMainDlg, IDC_RESULT );
TI.hParent=0;
TI.hInsertAfter=TVI_LAST;
TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
TI.item.pszText=szIp;
Node=TreeView_InsertItem(hTree, &TI);
// Start Winsock
WORD wVersionRequested = MAKEWORD( 1, 1 );
WSADATA wsaData;
if( WSAStartup( wVersionRequested, &wsaData ) != 0 )
{
wsprintf( szMessage, "WSAStartup() Error. ErrCode : %d ", GetLastError());
MessageBox( hMainDlg, szMessage, "Error", MB_OK | MB_ICONERROR );
return -1;
}
for( i = 1; i <= 65535; i++ )
{
if( ( fd = socket( AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET )
{
wsprintf( szMessage, "socket() Error. ErrCode : %d ", GetLastError());
MessageBox( hMainDlg, szMessage, "Error", MB_OK | MB_ICONERROR );
}
else
{
addr.sin_family = AF_INET;
addr.sin_port = htons(i);
addr.sin_addr.s_addr = inet_addr( szIp );
wsprintf( szMessage, "%s Host : %d Port Connecting...", szIp, i );
SendMessage( hState, SB_SETTEXT, 0, (LPARAM)szMessage );
if( connect( fd, (struct sockaddr *)&addr, sizeof(addr)) != SOCKET_ERROR )
{
struct servent * sv = getservbyport( htons(i), "tcp" );
if( sv )
wsprintf( szMessage, "%d ( %s )", i, sv->s_name );
else
wsprintf( szMessage, "%d", i );
TI.hParent=Node;
TI.hInsertAfter=TVI_LAST;
TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
TI.item.pszText=szMessage;
TreeView_InsertItem(hTree, &TI);
}
closesocket( fd );
}
}
WSACleanup();
SetDlgItemText( hMainDlg, IDOK, START_STR );
SendMessage( hState, SB_SETTEXT, 0, (LPARAM)"완료" );
return 0;
}
--------
그래서, 다른 방법을 찾고 있습니다.
언뜻 듣기로는 VxD에 손을 대야 한다던데...
그럼 답변 감사하고요.
계속되는 도움 기다리겠습니다.
|