gethostbyname() 함수

 

도메인(문자열) 정보로 ip, 별칭 등 host에 대한 정보를 구하는 함수.

 

#include <netdb.h>

struct hostent *gethostbyname(const char *name);

 

서버 이름 또는 도메인(예. www.it-note.kr)으로부터 주소정보(IP Address)를 얻습니다. 주소 정보는 local computer의 /etc/hosts 파일 또는 DNS 서버로 부터 주소 정보를 얻습니다.

 

 

struct hostent 구조체

struct hostent {
    char  *h_name;            /* official name of host */
    char **h_aliases;         /* alias list */
    int    h_addrtype;        /* host address type : AF_INET 또는 AF_INET6 */
    int    h_length;          /* length of address */
    char **h_addr_list;       /* list of addresses */
}

#define h_addr h_addr_list[0] /* for backward compatibility */ 

 

파라미터

name
    - IP 주소를 얻으려는 서버 이름 또는 서버에 대한 도메인명

 

RETURN

NULL
    - 오류가 발생하였습니다.

NULL 아님
    - struct hostent *를 return하며, 주소는 h_addr 멤버 변수에 저장되며, 
      그 주소의 길이는 h_length에 저장됩니다.
    - h_addr의 format은 network byte order의 주소이며, 
      인터넷 표준 점표기법으로 표시하려면 inet_ntoa( )로 변환이  필요합니다.

 


활용 예제

 

Sample

#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define SERVER_PORT   6905
#define SERVER_NAME   "www.it-note.kr"

......

int main(int argc, char **argv)
{
    struct hostent *he;
    struct sockaddr_in server_addr;
    int  sock;

    ......

    if((he = gethostbyname(SERVER_NAME)) == NULL) {
        fprintf(stderr, "%s는 등록되지 않은 서버명입니다.\n", SERVER_NAME);
        return -1;
    }

    memset(&server_addr, 0x00, sizeof(struct sockaddr_in));
    server_addr.sin_samily = AF_INET;
    memcpy(server_addr.sin.sin_addr, he->h_addr, he->h_length);
    server_addr.sin_port   = htons(SERVER_PORT);

    if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "Socket 생성 오류: %s\n", strerror(errno));
        return -1;
    }

    if(connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) {
        fprintf(stderr, "Connection Error: %s\n", strerror(errno));
        close(sock);
        return -1;
    }

    ......
}

 

 

참고 :
https://www.it-note.kr/22

basename() 함수 - 파일 이름 반환

 

1. basename - 역할

주어진 경로에서 파일 이름만 반환하는 함수.

 

 

1.1. 구문형식

 

basename(경로 , 접미사)

 

접미사가 입력되면 파일 이름에서 해당하는 접미사는 제거됨

 

 

 

2. basename - 예제

 

2.1. 코드

<body>
<?php
    
    $test_path = "/home/work/menu/test.php";
    
    echo basename ($test_path);
    echo "<br>";
    echo basename($test_path,".php");
?>
</body>

 

 

2.2. 결과화면

 

 

2.3. 설명

test_path는 경로를 나타내고 있고 basename() 함수를 통하여 파일 이름만 반환하고 있다.



 

 

참고 :

https://devjhs.tistory.com/211

'Web Programming Language > PHP' 카테고리의 다른 글

PHP) readfile() 함수  (0) 2021.01.15
PHP) HTTP Response Header - Content-Disposition 속성  (0) 2021.01.15
PHP) HTTP Header - MIME-Type, Content-Type  (0) 2021.01.14
PHP) shell_exec() 함수  (0) 2020.11.05
PHP) system() 함수  (0) 2020.11.05

[VB6.0] 내부함수 __vbaStrCopy

 

__vbaStrCopy 함수는 값을 복사해오는 함수로 보인다.

 

 

__vbaStrCopy

[int] __vbaStrCopy( BSTR* Source, BSTR* Destination );

This routine copies a BSTR from one memory location to another.

The Source BSTR is placed in EDX, the Destination BSTR is placed in ECX.

The return value is an integer in EAX which is a duplicate pointer to the Destination.

Code Example:

.text:00401961 mov edx, offset aString ; "STRING"

.text:00401966 lea ecx, [ebp-1Ch]

.text:00401969 mov [ebp-1Ch], esi

.text:0040196C call ds:__vbaStrCopy

.text:00401972 mov eax, [ebp-1Ch]

Explanation of code example:

You can see the string being moved into EDX and then a stack location into ECX. The copied string is then at both [ECX] and [EDX] and the return value in EAX is the same pointer as [ECX].

(c) 2004 Telos & SneakCharm

 

 

한글 번역

 

__vbaStrCopy

[int] __vbaStrCopy( BSTR* Source, BSTR* Destination );

이 루틴은 한 메모리 위치에서 다른 메모리 위치로 BSTR을 복사합니다.

Source BSTR은 EDX에 배치되고 Destination BSTR은 ECX에 배치됩니다.

반환 값은 목적지에 대한 중복 포인터인 EAX의 정수입니다.

코드 예제 :

.text:00401961 mov edx, offset aString ; "STRING"

.text:00401966 lea ecx, [ebp-1Ch]

.text:00401969 mov [ebp-1Ch], esi

.text:0040196C call ds:__vbaStrCopy

.text:00401972 mov eax, [ebp-1Ch]

코드 예제 설명 :

문자열이 EDX로 이동한 다음 스택 위치가 ECX로 이동하는 것을 볼 수 있습니다. 그러면 복사된 문자열은 [ECX]와 [EDX]에 모두 있으며 EAX의 반환 값은 [ECX]와 동일한 포인터입니다.

(c) 2004 Telos & SneakCharm

 

 

 

 

추가 ++)

BSTR에 대해... BSTR이란 무엇인가??

 

http://golbeng.egloos.com/86921

 

문자열을 표현하는 방법에는 다음과 같은 두가지 방법이 있다.

1. 일련의 문자들을 기록한 뒤, 맨 끝에 문자열의 끝을 나타내는 특별한 식별자를 기록한다.

2. 맨 앞에 문자열을 나타내는 총 바이트 수를 기록한 뒤, 일련의 문자들을 기록한다.

1번의 경우에 해당하는 대표적인 경우가 C/C++의 문자열이다.

C/C++에서는 문자열의 끝을 나타내기 위해 널(NULL) 문자를 사용한다.

2번의 경우에 해당하는 경우는 베이직이나 파스칼의 문자열이다.

우리가 다루고자 하는 BSTR도 바로 2번과 같은 형태를 가진 문자열이다.

자, BSTR에 대해 알아보자.

BSTR 타입은 마이크로소프트의 비주얼 베이직 개발팀에 의해 만들어 졌다.

비주얼 베이직은 포인터를 지원하지 못했기 때문에, 기존의 가상함수 테이블을 이용한

함수 호출이 불가능하였다. 이에 비주얼 베이직 개발팀은 IDispatch 인터페이스를

고안해 내었다. 비주얼 베이직과 COM 객체가 원활히 통신하기 위해서 COM에서 비주얼

베이직의 문자열 타입을 지원하게 되는 결과를 낳았는데, 그것이 바로 BSTR이다.

그래서, 이름이 BSTR(Basic STRing의 약자이다!)이기도 하다.

또한, BSTR는 COM에서 유니코드(Unicode) 문자열을 나타내는데 자주 사용된다.

비주얼 베이직(BSTR)는 개념적으로 2개의 필드로 구성된다.

첫번째 필드는 4바이트(unsigned long)로 구성되고, 실제 문자열의 총 바이트 수를 나타낸다.

(유니코드 문자들의 총 개수가 아니라, 바이트 수임에 명심하라!)

두번째 필드는 실제 문자열이며, NULL로 끝난다.

(다른 형식의 문자열과 호환성을 위해서 NULL로 끝나는 것 같다.)

(첫번째 필드에 기록된 총 바이트 수는 NULL 문자를 제외한 것임에 또한 명심하라!)

또한, 두번째 필드에 기록되는 문자들은 2바이트로 구성된다. 유니코드 문자이기 때문이다.

이렇듯 BSTR는 실질적으로 두 개의 필드로 구성되어 있다.

그러나, BSTR 타입은 표준 유니코드 문자 포인터에 지나지 않는다.

(실제로 BSTR 타입은 typedef OLECHAR __RPC_FAR* BSTR 로 정의되어 있다.

OLECHAR __RPC_FAR* 를 나타내는 타입인 것이다. OLECHAR은 결국 wchar_t의

다른 이름일 뿐이다.)

BSTR 포인터는 BSTR 타입 데이터의 두번째 필드, 즉 실제 문자열 부분을 가리킨다.

BSTR는 이렇게 정의되기 때문에 두 개의 필드로 구성됨을 알 필요없이,

보통의 유니코드 문자열과 똑같이 다룰 수 있는 것이다.

또한 BSTR 문자열은 COM에서 대표적으로 사용되는 유니코드 문자열이고,

COM은 다른 프로세스, 다른 컴퓨터 사이에서 사용될 수 있다.

그러므로 BSTR 문자열을 위한 메모리 할당/해제를 위해서 언어 종속적인

기능(new/delete, malloc/free ...)을 사용해서는 안된다.

COM이 제공하는 메모리 할당기로부터 할당/해제되어야 한다.

COM의 메모리 할당기를 사용하면서, 사용하기 편하게 하기 위해서

COM은 BSTR 문자열에 관한 API들을 제공한다.

SysAllocString(), SysFreeString(), SysReAllocString, SysStringLen()가 같이

"Sys.."로 시작하는 함수들이 그러한 COM이 제공하는 API 함수이다.

 

 

 

참고 : 

https://blog.naver.com/huangha/221738850374

 

Ctrl+F2 프로그램 재실행
Alt+F2 프로그램 닫기
F3 새 프로그램 열기
F5 활성화 되어 있는 윈도우 최대화, 혹은 원복
Alt+F5 olly 디버거 윈도우를 항상 위로
F7 Step into (함수 진입)
Ctrl+F7 Animate into (entering functions)
F8 Step over (executing function calls at once)
Ctrl+F8 Animate over (executing function calls at once)
F9 실행
Shift+F9 Pass exception to standard handler and run
Ctrl+F9 Execute till return
Alt+F9 Execute till user code
Ctrl+F11 Trace into
F12 Pause
Ctrl+F12 Trace over
Alt+B Open Breakpoints window
Alt+C Open CPU window
Alt+E Open Modules window
Alt+L Open Log window
Alt+M Open Memory window
Alt+O Open Options dialog
Ctrl+T Set condition to pause Run trace
Alt+X Close OllyDbg
F2 Toggle breakpoint
Shift+F2 Set conditional breakpoint
F4 Run to selection
Alt+F7 Go to previous reference
Alt+F8 Go to next reference
Ctrl+A Analyse code
Ctrl+B Start binary search
Ctrl+C Copy selection to clipboard
Ctrl+E Edit selection in binary format
Ctrl+F Search for a command
Ctrl+G Follow expression
Ctrl+J Show list of jumps to selected line
Ctrl+K View call tree
Ctrl+L Repeat last search
Ctrl+N Open list of labels (names)
Ctrl+O Scan object files
Ctrl+R Find references to selected command
Ctrl+S Search for a sequence of commands
Asterisk (*) Origin
Enter Follow jump or call
Plus (+) Go to next location/next run trace item
Minus (-) Go to previous location/previous run trace item
Space ( ) Assemble
Colon (:) Add label
Semicolon (;) Add comment
ctrl+, 아래 화살표키 디스어셈블 위치 지정

 

 

 

Main menu + 단축키

F9 Run
F12 Pause
F7 Single-step / Step-into
F8 Step-over
Ctrl+F7 Animate into
Ctrl+F8 Animate over
Ctrl+F9 Run until return
Alt+F9 Run until user code

 

[L] Log data
[E] Executable modules
[M] Memory map
[T] Threads
[W] Windows
[H] Handles
[C] CPU
[/] Patches
[K] Call stack of main thread
[B] Breakpoints
[R] References
[…] Run trace
[S] Source

 

Command + 단축키

  단축키   설명
 Go to [Ctrl+G]  원하는 주소로 이동(코드,메모리를 확인할 때 사용. 실행 X)
 Execute till Cursor [F4]  커서 위치까지 실행(디버깅하고 싶은 주소까지 바로 이동 가능)
 Comment ;  Comment 추가
 User-defined
 comment
   마우스 우측 메뉴 Search for User - defined comment
 Label :  Label 추가
 User-defined label    마우스 우측 메뉴 Search for User - defined label
 Set/Reset BreakPoint [F2]  BreakPoint 설정/해제
 Step Into [F7]  하나의 OP Code 실행(CALL 명령을 만나면 그 함수 코드 내부로 들어감)
 Step Over [F8]  하나의 OP Code 실행(CALL 명령을 만나면 따라 들어가지 않고 그냥 함수 자체를 실행함)
 Run [F9]  실행(BreakPoint가 걸려 있는 곳에서 실행 정지)
 Execute till return [Ctrl+
F9]
 함수 코드 내에서 RET 명령어까지 실행(함수 탈출 목적)
Show the current EIP *  현재 EIP의 위치를 보여줌
 Show the previous
 Cursor
-  직전 커서 위치를 다시 보여줌
All referenced text
strings
   마우스 우측 메뉴 - Search for - All referenced text stromgs (코드의 참조 문자열 확인)
All intermodular calls    마우스 우측 메뉴 - Search for - All intermodular calls (코드에서 호출되는 모든 API 함수 확인)
Name in all modules    마우스 우측 메뉴 - Search for - Name in all modules (모든 API 함수 확인)
Edit data [Ctrl+E]  데이터 편집
Assemble  [Space
  Bar]
 어셈블리 코드 작성
Copy to executable file    마우스 우측 메뉴 Copy to executable file (파일의 복사본 생성 - 변경사항 반영)
 Preview CALL/JMP
 address
[Enter]  커서가 CALL/JMP 등의 명령어에 위치하면 해당 주소를 따라가서 보여줌
 (실행 X, 간단한 함수 내용 확인에 유용함)

                                                                                            

 

 

참고 :

https://ac3lucifer.tistory.com/34

http://mer-bleu.tistory.com/7

 

 

 

+ Recent posts