C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76424] Re:Re: 특정 포트 점유하고 있는 프로세스 종료.
빌더(TWx) [builder] 852 읽음    2023-02-03 21:45
질문 님이 쓰신 글 :

: 빌더님께 도움 많이 받고있는 직장인 입니다
: 구글링 해보았으나 어떤 api를 써야할지 모르겠네요ㅠㅠ
:
:
:
: 빌더(TWx) 님이 쓰신 글 :
: : 콘솔콘솔 님이 쓰신 글 :
: : : 답변감사합니다. 제가 설명을 제대로 못 드린것 같네요.. 3번만 코딩하고싶은게아니라 1~3번 과정을 전부 빌더에서 코딩하고싶은거라서
: : : 1. system("netstat -ano|findstr");
: : : 이후 2.과정
: : : 3. 답변해주신것처럼 PID 랑 CMD 저장해서 taskkill 하는건데
: : :
: : : 2번과정이 제 질문입니다!
: : :
: : :
: : : 님이 쓰신 글 :
: : : :     int PID = 4000;
: : : :     char Cmd[1024];
: : : :
: : : :     sprintf(Cmd, "taskkill /f /pid %d", PID);
: : : :     system(Cmd);
: : : :
: : : :
: : : :
: : : : 콘솔콘솔 님이 쓰신 글 :
: : : : :
: : : : :
: : : : : 1. cmd 실행 -> netstat -ano|findstr 포트번호 로 사용중 포트 검색 ->    2. PID확인
: : : : :
: : : : :  3. taskkill /f /pid pid번호 로 task 죽이기 << 이 과정을 c++ buildr 내에서 버튼을 누르면 실행되게 하고싶은데요...
: : : : :
: : : : : system() 함수를 사용해서 하자니 1번 과정은 가능하지만 2번의 과정에서 PID 확인하여 변수를 저장하고싶은데 어떻게 저장해야할지 감을 못잡겠네요 참고할만한 링크나 조언좀 부탁드립니다
: :
: :
: :
: :
: : 답변;
: :
: :
: : Windows OS 가 제공해주고 있는 IP Helper API 이용해서...
: : TCP Protocol 테이블의 리모트 포트 값과 Owner 프로세스 ID 를 읽어서 처리하면 간단하게 구현 가능.
: :
: :



답변:


예제를 만들어 봅시다.

https://www.inlive.co.kr 로 들어가서 '라디오스타'라는 방송국을 선택하고

아래 그림 처럼 "http://kk2436.inlive.co.kr/live/listen.pls"를 복사해서...




윈앰프에 Open URL로 스트림 주소를 아래와 같이 로드했다고 해봅시다.





윈앰프에 URL 스트림 주소를 로드한 후, Fille Info를 통해서 해당 스트림이 사용하는
포트가 11040 임을 알 수 있습니다. (이 방송국의 스트림 고정 리모트 포트)





이 상태에서 테스트용으로 작성한 아래 프로그램을 실행하면...

//---------------------------------------------------------------------------

#include 
#include 
#include 
#pragma hdrstop

#include "Unit5.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm5 *Form5;
//---------------------------------------------------------------------------
__fastcall TForm5::TForm5(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int GetPortOwnerPID(int Port)
{
  typedef DWORD(WINAPI *PFPTR)(PVOID, PDWORD, BOOL,ULONG, TCP_TABLE_CLASS, ULONG);
  static auto GetTbl = PFPTR(GetProcAddress(LoadLibraryA("iphlpapi.dll"), "GetExtendedTcpTable"));

  assert(GetTbl);

  DWORD size{};
  GetTbl(nullptr, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
  std::vector< BYTE> v(size);
  GetTbl(v.data(), &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);

  DWORD n{};
  auto &p = *PMIB_TCPTABLE_OWNER_PID(v.data());
  for (auto e = p.table; n < p.dwNumEntries; ++n, ++e) {
    if(e->dwOwningPid && ntohs(e->dwRemotePort) == Port && e->dwState == MIB_TCP_STATE_ESTAB)
      return e->dwOwningPid;
  }
  return -1; // port not found.!
}
//---------------------------------------------------------------------------

void __fastcall TForm5::Button1Click(TObject *Sender)
{
  int Port = 11040;
  int ProcID = GetPortOwnerPID(Port);

  if(ProcID != -1) {
    Memo1->Lines->Add(String().sprintf(L"found Process(%d) using port %d", ProcID, Port));
    Memo1->Lines->Add(String().sprintf(L"kill Process(%d)", ProcID));
    ShellExecuteW(0, 0, L"taskkill", String().sprintf(L"/f /pid %d", ProcID).c_str(), 0, SW_HIDE);
  }
  else
    Memo1->Lines->Add(L"Process not found.!");
}
//---------------------------------------------------------------------------



다음과 같이 해당 포트를 사용하고 있는 프로세스를 찾아서(윈앰프) 종료하게 됍니다.




로컬포트는 OS에 의해서 할당되는 거라 의미없고, 리모트 포트인 11040을 대상으로 삼으면 되죠.


API 도큐먼트만 봐도 알수 있는 것은 질문하지 말고, 직접 합시다.



+ -

관련 글 리스트
76414 특정포트를점유하고있는프로세스를종료하고싶습니다 콘솔콘솔 679 2023/01/27
76415     Re:특정포트를점유하고있는프로세스를종료하고싶습니다 637 2023/01/29
76417         Re:Re:특정포트를점유하고있는프로세스를종료하고싶습니다 콘솔콘솔 626 2023/01/30
76419             Re:Re:Re:특정포트를점유하고있는프로세스를종료하고싶습니다 빌더(TWx) 762 2023/01/31
76423                 Re: C++빌더님 도와주십시오ㅠㅠ 질문 700 2023/02/02
76424                     Re:Re: 특정 포트 점유하고 있는 프로세스 종료. 빌더(TWx) 852 2023/02/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.