달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

윈도우에서도 리눅스처럼 visual studio나 이클립스같은 GUI가 없이 도스창에서 프로그램을 짜고 컴파일을 할 수 있다.

다만 리눅스에서는 초기에 컴파일 프로그램인 gcc가 깔려있지만

윈도우는 없기때문에 gcc를 직접 설치해 주어야 한다.

우선, 윈도우 도스창에서 컴파일 하기 위해 깔아야 하는 프로그램을 알아보자


<설치>

 1) MinGW

컴파일러로써 cmd창에 gcc명령이 먹히도록 한다.

MinGW는 http://www.mingw.org/ 에서 다운..

설치하고 난 후 환경변수설정을 해야 하는 데, 

환경 변수 설정은 시스템 변수가 아닌 사용자의 변수의 PATH에 C:\MinGW\bin을 넣어줘야 한다.

 

2) VIM

VIM은 메모장처럼 코드를 써 넣을 수 있는 에디터 프로그램이다.  (리눅스에서의 어디터 프로그램은 nano이다.)

vim은 여기서 다운 ...  http://www.vim.org/download.php

VIM을 설치하고 환경변수 를 설정해주면 cmd창 어디에서나 "VIM" 이라고 치면 이것을 실행할 수 있다.

cmd창에 vim "파일 이름"을 치면 입력한 파일 이름을 가진 파일이 현재 디렉토리에 만들어 진다.


3) make

c코드가 실행되는 .exe 파일로 컴파일되는 과정은 Prepocessin, Compilation, Assemble, Linking 네 단계를 거친다.

Preprocessing은 #include 한 헤더파일이나 #define 한 것은 붙이는 과정이다.

cpp main.c > main.i //Pre-procession only

Compilation은 c코드를 Assembly code로 바꾸는 과정이다. 

gcc -S hello.i //Compilation only

Assemble은 Assembly code를 기계어로 바꾸는 과정이다.

as -o main.o main.s // Assembling only

마지막으로 Linking은 기계어로 된 여러 파일로 만들어진 코드들을 하나로 합쳐 실행파일로 만드는 과정이다.

ld -o main.exe main.o ... additional library ... //Linking only


여기서 Linking과정을 제외한 preprocession, compiling, assembling과정을 한번에 해서 

c코드를 한번에 기계어고 바꾸는 과정을 빌드라고 한다.

gcc -c main.c //Object code main.o 출력

그 다음 실행코드를 만드는 것은 다음과 같이 하면 된다.

gcc -o main.exe main.o hello.c //Executable code 출력


어쨌든.... 컴파일 하려면 cmd창에 여러줄을 쳐야하는데 한 과정을 잘 못 하면 계속 다시 적어야 하기때문에 컴파일 과정을 한번에 해주는 유틸리티가 있는데 이것이 make이다.

make 프로그램은 http://gnuwin32.sourceforge.net/packages/make.htm 에서 다운가능하다.

다운한 다음에 C:\Program Files\GnuWin32\bin 로 path에 환경변수 설정을 한다.


<Let's do it>

이제 간단한 "hello world!"가 찍히는 프로그램을 실행하면서 어떻게 쓰는 것인지 알아보자.


1) vim

환경변수 path 설정을 했기 때문에 어떤 디렉토리에서는 vim을 실행시킬 수 있다.

cmd창이 있는 디렉토리에서 vim [파일이름]을 적으면 해당 이름을 가진 파일이 열린다.



vim에 들어갔으면 키보드의 i를 누르면 편집모드로 글을 적을 수 있다.


위와 같이 글을 다 적은 후에는 ESC를 누르면 명령어 모드로 바뀐다.

주요 명령어는 다음과 같다.

:w //저장

:w file.txt // file.txt 파일로 저장

:q //vim 종료

:wq //저장 후 종료



다음과 같이 코드를 적고 esc를 누른다음 :wq를 누르면 코드가 저장되고 해당 디텍토리에 파일이 만들어 진다.



마찬가지로 다음과 같이 hello.c와 hello.h를 만든다.



2) Makefile

c코드가 있는 같은 디렉토리에 Makefile을 만들어야 한다.



make의 기본규칙은 크게 Target, Depend, Command로 구성되어 있다.


<Targer>: <Depend>

<TAP 문자><Command>


Target은 생성하고자 하는 목적물을 지칭하고 

Depend는 Target을 만들기 위해서 필요한 요소를 기술하게 되고

Command는 일반 Shell 명령이 온다. 

여기서 주의할 것은 Comman 앞에 반드시 TAB문자가 와야 한다는 것이다.

Command 명령은 Depend와 Target의 파일생성시간(또는 변경된 시간)을 비교하여 Depand의 파일의 시간이 보다 최근일 경우에만 실행된다. 



다음과 같이 Makefile을 만들고 저장한다.

그리고 cmd 창에 "make run"이라고 치면 자동으로 컴파일되고 프로그램이 실행된다.

이러한 Makefile은 리눅스에서도 똑같이 쓸 수 있다.







참고

VIM 활경변수 설정

http://harveytoday.tistory.com/84

VIM 사용법

https://opentutorials.org/course/730/4561

http://www.morenice.kr/25

Makefile 만들기

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/minzkn_make

'프로그래밍 > 자료구조설계' 카테고리의 다른 글

인터넷 check sum 함수의 구현  (0) 2016.02.08
다운  (0) 2016.02.07
void*  (0) 2015.10.23
열거형 enum  (1) 2015.10.23
:
Posted by youjin.A

윈도우 운영 체제를 기반으로 간단한 TCP/IP 소켓통신을 구현해 보았다.


 ws2_32.lib 라이브러리를 링크

윈도우 기반의 소켓을 '윈속'이라고 하는데 이를 개발 하기위해서는 헤더파일 <winsock2.h>를 포함시켜야 한다.

이것을 포함시키기 위해서는 ws2_32.lib 라이브러리를 링크시켜야 한다.

현재 Visual studio 2013을 사용하고 있는데 2008으로도 가능하다는 것으로 봐서 다른 버전에서도 그대로 적용 가능한 것 같다.

ws2_32.lib 라이브러리를 링크시키기 위해서는 Project>properties>Linker>Input>Additional Dependencies에 ws2_32.lib를 적고 적용시킨다.


다음으로 server와 client 프로젝트를 각각 열고 코드를 입력한다.



server 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
 
void ErrorHandling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
 
int main(int argc, char ** argv)
{
    WSADATA wsaData;
    SOCKET hServSock;
    SOCKET hClntSock;
    SOCKADDR_IN servAddr;
    SOCKADDR_IN clntAddr;
    int szClntAddr;
    char message[] = "Hello World! \n";
 
    if (argc != 2){
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }
 
    if (WSAStartup(MAKEWORD(22), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }
 
    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if (hServSock == INVALID_SOCKET){
        ErrorHandling("socket() error");
    }
 
    memset(&servAddr, 0sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(atoi(argv[1]));
 
    if (bind(hServSock, (SOCKADDR*)&servAddr,
        sizeof(servAddr)) == SOCKET_ERROR){
        ErrorHandling("bind() error");
    }
 
    if (listen(hServSock, 5== SOCKET_ERROR){
        ErrorHandling("listen() error");
    }
 
    szClntAddr = sizeof(clntAddr);
    hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr,
        &szClntAddr);
    if (hClntSock == INVALID_SOCKET){
        ErrorHandling("accept() error");
    }
    send(hClntSock, message, sizeof(message), 0);
 
    closesocket(hClntSock);
    closesocket(hServSock);
    WSACleanup();
    return 0;
 
 
}
cs



client 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
 
void ErrorHandling(char* message);
 
int main(int argc, char ** argv)
{
    WSADATA wsaData;
    SOCKET hSocket;
    char message[30];
    int strLen;
    SOCKADDR_IN servAddr;
 
    if (argc != 3){
        printf("Usage: %s <IP> <port>\n", argv[0]);
        exit(1);
    }
 
    if (WSAStartup(MAKEWORD(22), &wsaData) != 0)
        ErrorHandling("WSAStartup() error!");
 
    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if (hSocket == INVALID_SOCKET)
        ErrorHandling("hSocketet() error");
 
    memset(&servAddr, 0sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(argv[1]);
    servAddr.sin_port = htons(atoi(argv[2]));
 
    if (connect(hSocket, (SOCKADDR*)&servAddr,
        sizeof(servAddr)) == SOCKET_ERROR)
        ErrorHandling("connet() error!");
 
    strLen = recv(hSocket, message, sizeof(message) - 10);
    if (strLen == -1)
        ErrorHandling("read() error!");
    message[strLen] = 0;
    printf("Message from server : %s \n", message);
 
    closesocket(hSocket);
    WSACleanup();
    return 0;
}
 
void ErrorHandling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
cs




server 실행하기


project에 마우스 오른쪽> Properties>Debugging>Command Argument 에 포트번호를 적는다. 9190



그 다음 server프로젝트를 빌드하고 디버깅하면 다음과 같이 뜬다.




client 실행하기

client도 마찬가지로 project에 마우스 오른쪽> Properties>Debugging>Command Argument 에 들어간다.

Command Argument 에 다가 server의 ip주소, 포르번호를 적는다.

지금은 server와 client 둘 다 내컴퓨터이니까 Command Argument에 127.0.0.1 9190 이라고 적는다.

그리고 client 프로젝트를 빌드하고 디버깅하면 server 프로세스에서 보낸 Hello world! 라는 메세지가 뜬다.


:
Posted by youjin.A
2015. 9. 16. 12:41

IP 유틸리티들 전자공학이론/데이터 통신2015. 9. 16. 12:41

wire shark

Term Project #1 2013104430 안유진.hwp


nslookup 

해당 호스트의 IP 주소를 찾는다.

nslookup <host name>


ipconfig

호스트의 TCP/IP 정보를 보여준다.

해당 컴퓨터의 IP주소를 확인 할 수 있고 ipconfig /all을 입력하면 MAC 어드레스까지 확인이 가능하다.

리눅스: ifconfig


ping

입력한 호스트가 인터넷에 연결되어 있는지 확인할 수 있다.

ping <host name>


tracert

network layer의 packet이 다른 호스트에 도착하는 데 지나가는 경로를 확인할 수 있다.

tracert <host name>


netstat

로컬 호스트의 네트워크 상태에 대한 정보를 볼 수 있다.

:
Posted by youjin.A