C# 에서 C++ DLL 불러서 쓰기 #5

Programming/C# 2018. 2. 15. 17:31 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


C# 에서 C++ DLL 불러서 쓰기 #5














5. error CS0214: 포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.




포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.

포인터는 안전하지 않은 키워드에만 사용할 수 있습니다. 자세한 내용은 안전하지 않은 코드 및 포인터를 참조하세요.

다음 샘플에서는 CS0214를 생성합니다.




// CS0214.cs  

// compile with: /target:library /unsafe  

public struct S  

{  

   public int a;  

}  


public class MyClass  

{  

   public static void Test()  

   {  

      S s = new S();  

      S * s2 = &s;    // CS0214  

      s2->a = 3;      // CS0214  

      s.a = 0;  

   }  


   // OK  

   unsafe public static void Test2()  

   {  

      S s = new S();  

      S * s2 = &s;  

      s2->a = 3;  

      s.a = 0;  

   }  

}  






unsafe 키워드를 붙여주면 된다.








C# 에서 C++ DLL 불러서 쓰기 #1

Programming/C# 2018. 2. 13. 15:39 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# 에서 C++ DLL 불러서 쓰기 #1



1. DllImport






DLL Import 시






        [DllImport("CPPDLL.dll"] ,  


         혹은 


        [DllImport("CPPDLL.dll", CallingConvention = CallingConvention.Cdecl)]



         쓰는 것을 볼 수 있다.






C#의 DllImport 특성은 기본 CallingConvention이 StdCall로 되어 있습니다.









DllImportAttribute Class

; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx


DllImportAttribute.CallingConvention Field

; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.callingconvention(v=vs.110).aspx












일반적인 코드는 __cdecl, __stdcall에 상관없이 C#에서는 명시적인 CallingConvention 없이도 잘 실행됩니다.












하지만 .Net 4.0 이상의 빌드 환경에서는 


명시적인 CallingConvention 이 필요할 수 있습니다.


















.Net 4.0 이상에서는


        [DllImport("CPPDLL.dll", CallingConvention = CallingConvention.Cdecl)]


이 방법으로 사용하는 것을 추천합니다.


































참고 : http://www.sysnet.pe.kr/2/0/11132 [C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (1) - x86 환경에서의 __cdecl, __stdcall에 대한 Name mangling]






336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용 


이 둘의 차이점?










공유 DLL에서 MFC 사용(Use MFC in a Shared DLL) : 응용프로그램 배포 시 mfc**.dll 파일을 함께 배포.
정적 DLL에서 MFC 사용(Use MFC in a Static Library) : 응용프로그램의 실행 파일에 mfc**.dll 이 포함되어 배포되기 때문에 응용프로그램만 배포.













기본적으로 "Use MFC in a Shared DLL" 가 설정되어 있습니다. 이 설정은 현재 개발중인 프로그램이 필요로 하는 라이브러리를 기본적으로 제공되는 DLL에서 참조하여 사용하겠다는 뜻입니다. 따라서 이 모드로 컴파일을 하여 실행파일을 배포하려면, 해당 컴파일에 Visual C++가 설치되어 있거나 다음과 같은 DLL이 있어야 합니다. mfc42d.dll, mfco42d.dll, msvcirtd.dll, msvcrtd.dll 물론 이 네 종류의 DLL 파일이 모두 있어야 하는 것은 아닙니다. 개발된 프로그램의 성격에 따라서 이 중 한 개정도가 필요 없을 때도 있습니다.

이 DLL은 이름이 mfc42d.dll과 같이 d로 끝나는데, 이 d는 "Debug" 의 약자로 생각하시면 됩니다. 이 파일들은 윈도우 시스템이 설치된 폴더의 "system32" 폴더 아래에 있습니다. 필요하다면, 해당 폴더에서 이 dll들을 복사해서 실행파일을 배포할 때 같이 배포하면 됩니다. 사실, 어떤 경우에 보면, 실행파일은 크기가 얼마되지 않는데 같이 붙어 다니는 dll의 사이즈가 엄청 큰 이상한 경우가 발생 하기도 합니다."Use MFC in a Static Library" 로 설정되어 있는 경우 컴파일을 하고 나서 실행파일을 배포할 때 별도의 dll을 같이 제공할 필요가 없습니다. 실행파일만 제공하면 되죠. 하지만, 이 방법은 별도의 dll이 없는 반면에 실행 파일의 사이즈가 좀 크다는 단점이 있습니다.
 
이 두 가지를 놓고 볼 때, 다음과 같이 일반적인 결론을 내릴 수 있습니다. 단순히 하나의 실행파일을 가지는 프로그램인 경우, "Use MFC in a Static Library" 를 사용해서 컴파일 하는 것이 비교적 유리하고 여러 개의 실행파일과 또는 dll이 사용되는 프로그램인 경우 각각의 실행파일 사이즈를 줄일 수 있는 "Use MFC in a Shared DLL"을 사용하는 것이 더 유리하다고 할 수 있습니다. 따라서 개발자가 이 두 가지 상황을 잘 판단해서 사용하면 될 것 같습니다.





  배포 시 응용프로그램만 배포하는게 관리하기도 편하고 오작동의 가능성도 적기 때문에 "정적 DLL 에서 MFC 사용" 으로 프로젝트를 설정하여 개발하게 된다.

  응용프로그램이 DLL 일 경우 위와 같이 설정하면 컴파일 시 다음과 같은 오류 메시지가 발생한다.
fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds

다음과 같이 설정해 주자.


1. 전처리기 정의

C/C++ → 전처리기 → 전처리기 정의
"_AFXDLL" 추가




2. 코드 생성

C/C++ → 코드 생성 → 런타임 라이브러리
Debug 모드일 경우    : "다중 스레드 디버그 DLL(/MDd)" 설정
Release 모드일 경우 :  "다중 스레드 DLL(/MD)" 설정







참고 : http://six605.tistory.com/466

참고 : https://social.msdn.microsoft.com/Forums/ko-KR/ba6bfe1c-8f80-45ea-809b-ec543dd6dc31/-dll-mfc-vs-mfc-?forum=asppnetko



hiredis fatal error C1853:

Programming/Redis 2016. 9. 29. 09:03 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

hiredis fatal error C1853:






hiredis\async.c : fatal error C1853: 'x64\Release\--------------.pch' 미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나, 미리 컴파일된 헤더가 C++인데 C에서 사용하고 있거나 또는 그 반대의 경우입니다.

hiredis\dict.c : fatal error C1853: 'x64\Release\--------------.pch' 미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나, 미리 컴파일된 헤더가 C++인데 C에서 사용하고 있거나 또는 그 반대의 경우입니다.

hiredis\hiredis.c : fatal error C1853: 'x64\Release\--------------.pch' 미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나, 미리 컴파일된 헤더가 C++인데 C에서 사용하고 있거나 또는 그 반대의 경우입니다.

hiredis\net.c : fatal error C1853: 'x64\Release\--------------.pch' 미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나, 미리 컴파일된 헤더가 C++인데 C에서 사용하고 있거나 또는 그 반대의 경우입니다.

hiredis\sds.c : fatal error C1853: 'x64\Release\--------------.pch' 미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나, 미리 컴파일된 헤더가 C++인데 C에서 사용하고 있거나 또는 그 반대의 경우입니다.





 미리 컴파일된 헤더














'Programming > Redis' 카테고리의 다른 글

Redis Client Connect Test  (0) 2016.10.26
Hiredis Subscribe/Publish with CWinThread  (0) 2016.10.05
How to use Pub/sub with hiredis in C++?  (0) 2016.09.29
hiredis MFC import Visual Studio 2013  (0) 2016.09.28
Windows7 Redis 설치 및 실행  (0) 2016.09.27

Programming Memory Error Magic Number

Programming/C,CPP,CS 2016. 9. 19. 09:54 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Programming Memory Error Magic Number


from: 

https://en.wikipedia.org/wiki/Magic_number_(programming)

http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations






Mainly Used Code


* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
* 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
* 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
* 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
* 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
* 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash.
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory





CodeDescription
..FACADE"Facade", Used by a number of RTOSes
1BADB002"1 bad boot"Multiboot header magic number[16]
8BADF00D"Ate bad food", Indicates that an Apple iOS application has been terminated because a watchdog timeout occurred.[17]
A5A5A5A5Used in embedded development because the alternating bit pattern (1010 0101) creates an easily recognized pattern on oscilloscopes andlogic analyzers.
A5Used in FreeBSD's PHK malloc(3) for debugging when /etc/malloc.conf is symlinked to "-J" to initialize all newly allocated memory as this value is not a NULL pointer or ASCII NUL character. (It may be a play on Russian "опять", pronounced "a piat'" which is A5 read aloud, meaning "again")[citation needed]
ABABABABUsed by Microsoft's debug HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory.[18]
ABADBABE"A bad babe", Used by Apple as the "Boot Zero Block" magic number
ABBABABE"ABBA babe", used by Driver Parallel Lines memory heap.
ABADCAFE"A bad cafe", Used to initialize all unallocated memory (Mungwall, AmigaOS)
0DEFACED"Defaced", Required by Microsoft's Hyper-V hypervisor to be used by Linux guests as their "guest signature", after changing from original 0xB16B00B5 ("Big Boobs")
BAADF00D"Bad food", Used by Microsoft's debug HeapAlloc() to mark uninitialized allocated heap memory[18]
BAAAAAAD"Baaaaaad", Indicates that the Apple iOS log is a stackshot of the entire system, not a crash report[17]
BAD22222"Bad too repeatedly", Indicates that an Apple iOS VoIP application has been terminated because it resumed too frequently[17]
BADBADBADBAD"Bad bad bad bad"Burroughs large systems "uninitialized" memory (48-bit words)
BADC0FFEE0DDF00D"Bad coffee odd food", Used on IBM RS/6000 64-bit systems to indicate uninitialized CPU registers
BADDCAFE"Bad cafe", On Sun MicrosystemsSolaris, marks uninitialised kernel memory (KMEM_UNINITIALIZED_PATTERN)
BBADBEEF"Bad beef", Used in WebKit[clarification needed]
BEEFCACE"Beef cake", Used by Microsoft .NET as a magic number in resource files
C00010FF"Cool off", Indicates Apple iOS app was killed by the operating system in response to a thermal event[17]
CAFEBABE"Cafe babe", Used by Java for class files
CAFED00D"Cafe dude", Used by Java for their pack200 compression
CAFEFEED"Cafe feed", Used by Sun MicrosystemsSolaris debugging kernel to mark kmemfree() memory
CCCCCCCCUsed by Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory. CC resembles the opcode of the INT 3 debug breakpoint interrupt on x86 processors.
CDCDCDCDUsed by Microsoft's C/C++ debug malloc() function to mark uninitialized heap memory, usually returned from HeapAlloc()[18]
D15EA5E"Disease", Used as a flag to indicate regular boot on the Nintendo GameCube and Wii consoles
DDDDDDDDUsed by MicroQuill's SmartHeap and Microsoft's C/C++ debug free() function to mark freed heap memory[18]
DEAD10CC"Dead lock", Indicates that an Apple iOS application has been terminated because it held on to a system resource while running in the background[17]
DEADBABE"Dead babe", Used at the start of Silicon GraphicsIRIX arena files
DEADBEEF"Dead beef", Famously used on IBM systems such as the RS/6000, also used in the original Mac OS operating systemsOPENSTEP Enterprise, and the Commodore Amiga. On Sun MicrosystemsSolaris, marks freed kernel memory (KMEM_FREE_PATTERN)
DEADCAFE"Dead cafe", Used by Microsoft .NET as an error number in DLLs
DEADC0DE"Dead code", Used as a marker in OpenWRT firmware to signify the beginning of the to-be created jffs2 file system at the end of the static firmware
DEADFA11"Dead fail", Indicates that an Apple iOS application has been force quit by the user[17]
DEADF00D"Dead food", Used by Mungwall on the Commodore Amiga to mark allocated but uninitialized memory [19]
DEFEC8ED"Defecated", Used for OpenSolaris core dumps
EBEBEBEBFrom MicroQuill's SmartHeap
FADEDEAD"Fade dead", Comes at the end to identify every AppleScript script
FDFDFDFDUsed by Microsoft's C/C++ debug malloc() function to mark "no man's land" guard bytes before and after allocated heap memory[18]
FEE1DEAD"Feel dead", Used by Linux reboot() syscall
FEEDFACE"Feed face", Seen in PowerPC Mach-O binaries on Apple Inc.'s Mac OS X platform. On Sun MicrosystemsSolaris, marks the red zone (KMEM_REDZONE_PATTERN)

Used by VLC player and some IP cameras in RTP/RTCP protocol, VLC player sends four bytes in the order of the endianness of the system. Some IP cameras expecting that the player sends this magic number and do not start the stream if no magic number received.

FEEEFEEE"Fee fee", Used by Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.[18]


'Programming > C,CPP,CS' 카테고리의 다른 글

OpenSSL x64 Build  (0) 2016.09.27
debug_crt_heap table  (0) 2016.09.19
openssl error LNK2019: 외부 기호 에러  (0) 2016.09.19
openssl AES encrypt (AES_ctr128_encrypt)  (0) 2016.09.19
openssl AES Mode : ECB, CBC, CFB, OFB, CTR  (0) 2016.09.05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

openssl error LNK2019: 외부 기호 에러









#pragma comment(lib, "libeay32.lib")

#pragma comment(lib, "ssleay32.lib")




lib 파일 참조 추가

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Grid control 2.27 DragAndDrop Error








가끔씩 Grid 컨트롤 내의 셀을 컨트롤 밖으로 드래그앤드랍을 하게 되면 에러가 발생한다.






EnableDragRowMode(FALSE);



으로 설정해주니





해당 에러가 발생하지 않는다.






Log4cxx Build in VS2013

Programming/C,CPP,CS 2016. 6. 29. 15:01 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Log4cxx Build in VS2013


1. DownLoad FIles


Apache log4cxx 

Apache Portable Runtime (APR)
Apache Portable Runtime-util (APR-util)

GNU Sed


apache-log4cxx-0.10.0.zip

apr-1.5.2-win32-src.zip

apr-util-1.5.4-win32-src.zip

sed-4.2.1-setup.exe




2. Installation


2.1. Decompress APR, APR-util, log4cxx File in same folder
...\log4cxx\apr
...\log4cxx\apr-util
...\log4cxx\log4cxx

2.2 Install GNU sed
Run "sed-4.2-1-setup.exe"
Add environment variable %PATH% : "C:\Program Files\GnuWin32\bin" 

2.3 in "cmd.exe" move to "...\log4cxx" folder
Run "configure.bat" in "cmd.exe"
Run "configure-aprutil.bat" in "cmd.exe"

2.4. Compile "C:\work\log4cxx\log4cxx\projects\log4cxx.dsw"
Result : log4cxx.dll, log4cxx.lib
("...\log4cxx\projects\Debug or Release")

config1.

log4cxx 프로젝트 속성 / 구성 속성 / 링커 / 입력 / 추가 종속성 : 
apr.lib,
aprutil.lib,
xml.lib
추가

config2.
apr,aprutil,xml 프로젝트 속성/ 구성 속성/ 라이브러리 관리자/ 일반/출력 파일
apr.lib,
aprutil.lib,
xml.lib
이름과 같은지 확인(apr-1.lib 인경우가 있음)

config3.
log4cxx 프로젝트 속성 / 구성 속성 / C/C++ / 추가 포함 디렉터리 : 
..\src\main\include
..\..\apr\include
..\..\apr-util\include

config4.
log4cxx 프로젝트 속성 / 구성 속성 / 링커 / 추가 라이브러리 디렉터리 : 
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD

Error1. C2252

LOG4CXX_LIST_DEF( ... , ... );

move to out of class area, in same namespace

but, 

LOG4CXX_LIST_DEF(ConnectionList, Connection);  

move with 

typedef log4cxx::helpers::SocketPtr Connection; 


Error2. C2039

"LoggingEvent::KeySet" change to "KeySet"


Error3. LNK2019

프로젝트 속성 / 구성 속성 / 링커 / 입력 / 추가 종속성 : Rpcrt4.lib 추가






'Programming > C,CPP,CS' 카테고리의 다른 글

비쥬얼 스튜디오 디버깅 팁 ( Visual Studio Debugging Tips )  (0) 2016.08.09
C++ Standard library has many containers  (0) 2016.07.19
Log4cxx Tutorial  (0) 2016.06.28
Log Librarys  (0) 2016.06.27
ATL,CPP,C# dll 배포  (0) 2016.05.27

ATL,CPP,C# dll 배포

Programming/C,CPP,CS 2016. 5. 27. 10:56 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL,CPP,C# dll 배포


dll 배포 관련 질문이 올라와서 저도 다시 한번 정리 할겸 올려 봅니다.







DLL reg 등록 방법


1. Visual Studio 기반으로 dll 을 만들어서


 디버그 옵션을 조절하여 


 html 이나 특정 app 을 실행하는 형태로 프로젝트 설정을 하였다면


 자동으로 Visual Studio 가 dll 을 해당 컴퓨터에 등록하게 됩니다.



배포를 하려면 배포할 컴퓨터에 일일이 Visual Studio 를 설치 할 수 없으므로


아래의 방법을 활용 합니다.




2.  regsvr32.exe 활용


regsvr32.exe 는 


C:\Windows\System32 경로에 존재합니다.



참고 64비트 버전의 Windows 운영 체제에는 다음과 같은 두 가지 버전의 Regsv32.exe 파일이 있습니다.

  • 64비트 버전은 %systemroot%\System32\regsvr32.exe입니다.
  • 32비트 버전은 %systemroot%\SysWoW64\regsvr32.exe입니다.



regsvr32.exe 사용중 오류는 msdn 문제 해결 방법이 제일 무난한것 같습니다.



https://support.microsoft.com/ko-kr/kb/249873






사용방법은


관리자 권한으로 cmd 를 연 후


등록 : regsvr32 xxxx.dll

등록해제 : regsvr32 xxxx.dll /u


인데


regsvr32 를 찾지 못할경우 system 경로로 이동하여 실행하거나


regsvr32 만 필요한 경로에 복사하여 사용하여도 됩니다.



regsvr32 는 C, CPP, ATL dll 을 올리기 위한 용도이고


같은 방법으로 regasm 을 활용하면 C# dll 을 올릴수 있습니다.


3. Install Uitility


인스톨 쉴드, 인스톨 팩토리등 인스톨 관련 유틸리티를 활용하여


setup.exe 파일을 만들경우 dll 을 등록하는 메뉴도 있기에 설치하며 등록 할 수도 있습니다.









'Programming > C,CPP,CS' 카테고리의 다른 글

Log4cxx Tutorial  (0) 2016.06.28
Log Librarys  (0) 2016.06.27
Free Dia Diagram Editor  (0) 2016.04.28
Windows 버전별 기본 포함 .NET Framework  (0) 2016.04.14
c# dll ClassLibrary 에서 MessageBox.Show(text,title);  (0) 2016.04.06

Winpcap Test 02

Programming/C,CPP,CS 2016. 3. 7. 09:08 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Obtaining advanced information about installed devices



 



/* * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Politecnico di Torino, CACE Technologies * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include <stdio.h> #include "pcap.h" #ifndef WIN32 #include <sys/socket.h> #include <netinet/in.h> #else #include <winsock.h> #endif // Function prototypes void ifprint(pcap_if_t *d); char *iptos(u_long in); char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen); int main() { pcap_if_t *alldevs; pcap_if_t *d; char errbuf[PCAP_ERRBUF_SIZE+1]; char source[PCAP_ERRBUF_SIZE+1]; printf("Enter the device you want to list:\n" "rpcap:// ==> lists interfaces in the local machine\n" "rpcap://hostname:port ==> lists interfaces in a remote machine\n" " (rpcapd daemon must be up and running\n" " and it must accept 'null' authentication)\n" "file://foldername ==> lists all pcap files in the give folder\n\n" "Enter your choice: "); fgets(source, PCAP_ERRBUF_SIZE, stdin); source[PCAP_ERRBUF_SIZE] = '\0'; /* Retrieve the interfaces list */ if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf); exit(1); } /* Scan the list printing every entry */ for(d=alldevs;d;d=d->next) { ifprint(d); } pcap_freealldevs(alldevs); return 1; } /* Print all the available information on the given interface */ void ifprint(pcap_if_t *d) { pcap_addr_t *a; char ip6str[128]; /* Name */ printf("%s\n",d->name); /* Description */ if (d->description) printf("\tDescription: %s\n",d->description); /* Loopback Address*/ printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no"); /* IP addresses */ for(a=d->addresses;a;a=a->next) { printf("\tAddress Family: #%d\n",a->addr->sa_family); switch(a->addr->sa_family) { case AF_INET: printf("\tAddress Family Name: AF_INET\n"); if (a->addr) printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr)); if (a->netmask) printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr)); if (a->broadaddr) printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr)); if (a->dstaddr) printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr)); break; case AF_INET6: printf("\tAddress Family Name: AF_INET6\n"); if (a->addr) printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str))); break; default: printf("\tAddress Family Name: Unknown\n"); break; } } printf("\n"); } /* From tcptraceroute, convert a numeric IP address to a string */ #define IPTOSBUFFERS 12 char *iptos(u_long in) { static char output[IPTOSBUFFERS][3*4+3+1]; static short which; u_char *p; p = (u_char *)&in; which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1); _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]); return output[which]; } char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen) { socklen_t sockaddrlen; #ifdef WIN32 sockaddrlen = sizeof(struct sockaddr_in6); #else sockaddrlen = sizeof(struct sockaddr_storage); #endif if(getnameinfo(sockaddr, sockaddrlen, address, addrlen, NULL, 0, NI_NUMERICHOST) != 0) address = NULL; return address; }






error LNK2019: __imp__getnameinfo@28 외부 기호(참조 위치: _ip6tos 함수)에서 확인하지 못했습니다.


Re: About error LNK2001: unresolved external symbol in a winsock application

You need corresponding Ws2_32.lib file to be added to your project to link with.
Header file contains only function declareations.



이런 에러가 뜬다.



링커 input 에 Ws2_32.lib 를 추가



'Programming > C,CPP,CS' 카테고리의 다른 글

Winpcap Test 04  (0) 2016.03.07
Winpcap Test 03  (0) 2016.03.07
Winpcap Test 01  (0) 2016.03.07
CPP 2015-01-15 수업내용 정리  (0) 2015.01.15
C 2015-01-09 실습  (0) 2015.01.09