달력

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

1. 과제명: 인터넷 Checksum 함수의 구현

2. 제출기한: 2015년 11월 18일(수)

3. 제출방법: on-line 제출

4. 내용:

 

인터넷 Checksum 계산과 검사를 위한 함수를 C로 구현하라. 구현하는 함수는 아래 내용을 참고하고, 함수의 이름이나 넘겨받는 메시지의 유형은 필요에 따라 다르게 정의하여도 된다.

 

(1) Checksum 계산과 검사를 위한 루틴에 대한 flow chart를 작성하라.

(구현은 교재 p.280의 Figure 10.17 인터넷 Checksum 알고리즘을 참고할 것.)

-Checksum계산

 

-Checksum 검사

 

  

(2) 아래의 함수를 완성하라.

 

int calculation_Checksum(message)

int *message;

{

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int calculaton_Checksum(int* message)
{
    /* 임의의 길이를 갖는 메시지를 넘겨받아 Checksum을 계산하여 return한다.*/
    int Checksum;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if (pre_sum > sum)
            sum++;
        pre_sum = sum;
    }
 
    Checksum = ~sum;
 
    message[data_num] = Checksum;
    data_num++;
 
    return Checksum;
}
cs

}

 

int check_Checksum(message)

int *message;

{

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int check_Checksum(int* message)
{
    /* Checksum이 부착된 임의의 메시지를 넘겨받아, 에러가 검출되면 0, 아니면 1을 return한다. */
    int result = 0;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if ((unsigned int)pre_sum >(unsigned int)sum)
            sum++;
        (int)pre_sum = (int)sum;
    }
 
    result = ~sum;
 
    if (result == 0)
        return 1;
    else
        return 0;
}
 
cs

}

 

(3) 완성된 함수 calculation_Checksum()와 check_Checksum()를 동작을 검증할 수 있는 테스트 프로그램을 작성하고 시험하라.

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#define MAXNUM 100
 
int data_num;
 
void sending_message(int* message)
{
    printf("데이터의 갯수를 입력하시오.");
    scanf_s("%d"&data_num);
    if (data_num >= MAXNUM)
    {
        printf(" 최대 가능한 데이터 갯수를 초과하였습니다.\n 프로그램 종료.\n");
        exit(-1);
    }
 
 
    printf("데이터를 입력하시오.\n");
    for (int i = 0; i < data_num; i++)
    {
        scanf_s("%d"&message[i]);
    }
    printf("데이터 입력이 끝났습니다.\n\n");
 
}
 
int calculaton_Checksum(int* message)
{
    /* 임의의 길이를 갖는 메시지를 넘겨받아 Checksum을 계산하여 return한다.*/
    int Checksum;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if (pre_sum > sum)
            sum++;
        pre_sum = sum;
    }
 
    Checksum = ~sum;
 
    message[data_num] = Checksum;
    data_num++;
 
    return Checksum;
}
 
int check_Checksum(int* message)
{
    /* Checksum이 부착된 임의의 메시지를 넘겨받아, 에러가 검출되면 0, 아니면 1을 return한다. */
    int result = 0;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if ((unsigned int)pre_sum >(unsigned int)sum)
            sum++;
        (int)pre_sum = (int)sum;
    }
 
    result = ~sum;
 
    if (result == 0)
        return 1;
    else
        return 0;
}
 
void print(int* message)
{
    printf("message: ");
 
    for (int i = 0; i < data_num; i++)
        printf("%d ", message[i]);
    printf("\n");
}
 
int main(void)
{
    int mes[MAXNUM];
    int Cks;
 
    sending_message(mes);
    printf("sender: \n");
    print(mes);
 
    Cks = calculaton_Checksum(mes);
    printf("checksum: %d\n\n", Cks);
 
    if (!check_Checksum(mes))
        printf("Checksum error!!");
    else{
        printf("Receiver: \n");
        print(mes);
    }
    return 0;
}
 
cs



Term Project #2 2013104430 안유진.hwp


 

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

다운  (0) 2016.02.07
void*  (0) 2015.10.23
열거형 enum  (1) 2015.10.23
윈도우에서 리눅스처럼 컴파일하기  (1) 2015.09.19
:
Posted by youjin.A