전체 글: 429개의 글

라즈베리파이 프로젝트 준비#2-1 - 구성품 리뷰

Posted by ironmask84
2017. 10. 24. 20:38 나는 프로그래머다!/Sensor



라즈베리파이로 (Raspberry PI) 프로젝트를 진행하고 있습니다만,

많이 더딥니다. ㅎㅎ

현재까지 Putty로 SSH 접속까지 진행했는데요. ( http://ironmask.net/389 )

조만간 WIFI 접속과 LED 컨트롤까지 진행을 할 예정입니다. ㅎㅎ

구입을 한 후에 제품 구성에 대해 한 번 리뷰하려고 합니다.

심플하지만, 구성이 깔끔하면서도 세심한 부분도 있어요 ^^

구입부는 아래 주소를 참조해 주세요 ^^

http://ironmask.net/387 )


기본 구성품

저는 가징 기본 세트인, 

라즈베리파이 3세대 + 정식케이스 + 방열판 세트 으로 구입했습니다.

아래 사진 나갑니다~ : )


 케이스는 위처럼 5가지 부품으로 나눠져 있어요! (색상은 레드, 블랙있는데 저는 레드로!!) 


 40개의 gpio핀과, BCM28xx CPU, SMSC 칩(이더넷 모듈) 등이 보이죠?? 


 뭐가 달라보이나요??  2개의 칩 위에 방열판을 붙였습니다. ㅋㅋ 


 바닥부분인데, 미끄럼방지용 스티커가 인상적입니다. ^^ 


 13인치 노트북 그램과 라즈베리파이 비교 
 물론 크기차이 만큼 성능차이, 가격차이도 큽니다. ㅋㅋ


 

 라즈베리파이 프로젝트

라즈베리파이 프로젝트 실전#1 - LED 컨트롤
라즈베리파이 프로젝트 준비#4 - WIFI 설정
라즈베리파이 프로젝트 준비#3 - OS 설치 및 Putty SSH 접속
라즈베리파이 프로젝트 준비#2-1 - 구성품 리뷰

라즈베리파이 프로젝트 준비#2 - 구입 리뷰

라즈베리 파이 프로젝트 준비#1 - 스펙 리뷰
  




 

네트워크#1 - TCP, UDP, MTU

Posted by ironmask84
2017. 10. 18. 16:31 나는 프로그래머다!/Sensor



라즈베리파이와 같은 네트워크 기능이 있는 디바이스를 가지고 개발을 하다보면,

네트워크 성능 측정 및 기능체크를 위해 'iperf' 라는 툴로 패킷을 주고받는 측정을 합니다.

이 iperf라는 툴을 사용 시에, 여러가지 옵션을 설정할 수 있는데,

그 중에 TCP, UDP와 같이 프로토콜 선택은 물론,

패킷 사이즈 및 갯수 등과 MSS(MTU 에서 특정 header를 뺀 것)을 설정할 수 있습니다.

예전에 네트워크 관련 스터디를 통해 들어본 바 있는 용어이지만,

다시금 뇌에서 되살려 보는 차원에서 기록 및 공유 합니다. 


TCP와 UDP

TCP 패킷 구조도


Sport =
송신자 포트

Dport= 수신자 포트

Sequence Number= TCP전송되는 데이터의 일련 넘버

Acknowledgment number= 응답 데이터 일련 넘버 + 전송된 데이터 합

Header Lengths = TCP Header 길이

Reserved = 예약된 번호 현재 사용되지 않음 항상 0

Control Bit = 패킷을 어떻게 다룰지 흐름등 관리하기 위한 사항

1.     URG = 최우선 순위 긴급한 패킷

2.     ACK = ACK필드 유효시 1

3.     PSH = 우선순위는 좀 떨어지더라도 최대한 빠른 전송 요청

4.     ROT = 현재 세션을 재 시작하려 할 때 사용 Session을 끊을때도 사용함

5.     SYN = Sequence Number를 송신측과 동기화하려 할 때 Session시작 시

6.     FIN = Session을 끊고자 할 때

Windows = 수신측에서 처리할 수 있는 Buffer

Checksum = TCP 오류 검증을 위한 데이터

Urgent Pointer= 급처리 데이터 마지막 바이트

Option = 필요시 생성 그다지

Padding = 32Bit의 배수를 만듬



UDP 패킷 구조도


LLC에서는 ethertype IP가 대입이 되어야 IP Packet이 되는 것이고 IP Header에서는 Type TCP UDP가 대입이 되어야지 TCP Packet UDP Packet이 만들어 집니다. ^^ 헤헤..


보시면 왜 MAC IP TCP순인줄은 금방 아시겠지요. ^^

         L2   L3 L4 입니다.

Layer Switch의 경우 L2Switch L3Switch L4Switch이렇게 나누자나요.


이 기준은 바로 Packet을 어디까지 분석해서 보내는지를 나타내는 거죠 ^^

IP만 보면 L3, Port까지 보고 스위칭하면 L4,


아무래도 앞에 있어야 분석하기 쉽겠죠. ^^ L2~L4까지 만약 L4가 먼저 있음 L2스위치는 포워딩하려면 L2데이터가 어딨는지 찾는데 딜레이타임이 걸릴 테니까.


또한 IP레벨의 스위칭도 여러가지 입니다.


보통은 목적지만 보고 라우팅하는데, 시스코의 CEF나 기타 프로토콜은 소스를 같이 보고 라우팅하죠. 이게 무슨 차이냐고 말씀하시는데 -_-;; 생각해보세요.

힌트는 LoadBanlancing입니다. 부하 분산에 차이죠. 라인이 하나라면 목적지만 보고 보내는 거랑 별 차이 없겠죠. 그러나 라인이 둘이라면 좀 다른 문제겠죠. ^^;;

출처: http://redsejo.tistory.com/4 [기도로 시작하는 하루]


MTU, MSS 란?

//MTU 란? http://qaos.com/article.php?sid=149

PING –f –l <MTU Size(Packet size + 28)> <interface default gateway address>
( 여기서 28은 'IP Header (20 bytes) + ICMP-Header (8 bytes)' )

Ex) ping <IP Address> -f -l <576~1500>로 값을 넣어 1472 로 값이 나왔다면 1472 + 28 = 1500 , 즉 MaxMTU 값은 '1500' 이 됩니다.


//MSS란(Maximum Segment Size)? 데이터 프레임 중 순수한 TCP 데이터 부분의 최대 값으로 분할하지 않고 한번에 보내는 것을 뜻합니다.

"윈도우 사이즈(크기) : TCP 환경에서 송신 호스트와 수신 호스트는 데이터를 수신한 다음, 다음 데이터를 보내 줄 것을 요청(Ack)하고, 요청을 받은 호스트는 다음 데이터를 보냅니다. 이런 과정에서 송신호스트는 Ack을 수신하기 전에 일정량의 데이터를 보낼 수 있는데 이를 윈도우 사이즈라고 합니다.

MSS(Maximum Segment Size) : 현재의 연결에서 TCP가 보낼 수 있는 최대의 데이터 크기를 말합니다. MTU라고 알려진 최대 전송 크기에서 헤더 부분을 뺀 부분이 MSS가 됩니다. Ethernet의 경우 MTU가 1500byte로 결정되어 있으며, 따라서 Ethenet에서 MSS는 1460byte가 됩니다.



" - 인용 ( 초보 서버 관리자를 위한 네트워크 및 보안 기초 포켓북 )

  
MSS = MaxMTU - 40 ( 40 = 'IP Header(20 bytes) + TCP Header (20 bytes + ? bytes)' )
Ex) 1500 - 40 = 1460 ( ? = 12byte , timestamp 옵션 적용시 추가됨 )

'Tcp1323Opts(Timestamp - RFC 1323)' 옵션에 'timestamp'이 활성화될 경우,
'Client ACK: TCP header'는 12byte를 추가한다. 즉, MSS 값은 1448 이 된다.

출처 : http://url.tistory.com/3

 

PHP와 Javascript 동작 개념

Posted by ironmask84
2017. 10. 17. 15:55 나는 프로그래머다!/PHP



웹프로그래밍을 하다보면, php와 JavaScript를 함께 사용을 프로그래밍을 합니다.

최근에야 php를 처음 접하다보니, JavaScript와 동시에 코딩을 하다보니, 

웹페이지에서 동적인 수행결과들에 대해 혼동이 오더군요 


간단하게 정리를 해보면,

php와 JavaScript둘다 동적인 웹페이지가 생성되면서, 제어되는 부분에서는 같지만,

php는 내부 데이터를 처리하기에 적합하고, JavaScript는 html로 보여지는 View 부분을 동적으로 제어하는 것입니다.


사실 php내에서도 Javascript 동작을 할 수는 있습니다.

ex) <?php
         echo "<script> window.open('main.php', '_self', ' '); </script>";
      ?>

반대로, javascript에서는 php를 이용한 제어는 불가하며, php에서 사용한 변수 값을 가져오는 정도는 가능합니다.

ex) <script>
         document.getElementById('current_time').innerText = '<?=$time?>';
     </script>


이유는, php는 서버에서 수행되고, JavaScript는 대부분 클라이언트(웹브라우져)에서 수행되기 때문입니다.

즉, php는 페이지 콜이 일어나는 순간 소스를 분석해서 내부 데이터 처리를 합니다. 

그리고 JavaScript는 만들어진 페이지 내에서 동적으로 페이지를 제어하는 방법을 제공해준다.

그러므로 JavaScript를 사용해서 동적으로 php를 다시 호출하거나 제어할 수 없습니다.





 

PHP 샘플코드 - 파일입출력과 문자열 파싱

Posted by ironmask84
2017. 10. 17. 10:21 나는 프로그래머다!/PHP



C언어 버젼에 이어 PHP 버젼으로도 파일입출력과 문자열 파싱 들어갑니다!
http://ironmask.net/392 )

전반적으로 C언어와 비슷한데,

함수가 좀 더 사용성이 좋고, 다양한 느낌이 있습니다.

이용한 함수보다 더 다양하게 제공되는 함수들이 있으니,

간략하게 잘 정리된 블로그를 공유드립니다. ( http://slreference.tistory.com/8 )


주제 요약 설명

PHP 언어로 파일을 읽어와서

특정 키워드 를 포함하는 함수를 통해 값을 얻어오고,

특정 delimiter로 파싱해서 결과물을 얻는 코드 입니다.

주요 사용 함수는 fopen, fgets, parse_strisset, strchr, explode입니다.

프로그래밍 언어의 기본 문법과 함수에 대한 사용법을 어느 정도 숙지하신 것을 

기본 전제로 진행합니다. ^^


샘플 코드

아래 코드는 file을 읽어와서 내장함수 parse_str을 이용한 것입니다.

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
<?php
 
// form을 wifiSet.php로 보내서, 파일 저장
 
include "settings.php";
 
// wifi setting
$fp = fopen("wifisetting.txt""r+");
if (!$fp) {
    die("<br/>Failed to open file.");
    echo "<script> alert('Failed to open file.'); </script>";
}
 
// wifienable=0&networkName=1 형식의 문자열을 wifienable 변수 생성 후 0을 넣어주고, networkName변수 생성 후 1을 넣어주는 함수
parse_str(fgets($fp));
 
// 예외처리는 각 설정에 대한 변수가 있느냐?  isset() 함수 그리고 그 변수에 값이 있느냐?  empty() 함수 <- true/false 반환
// 예외에 걸리면, 보드에서 새로 값 가져오기? or 설정파일 다시 생성??
 
if(isset($wifienable)){    // 예외처리를 위한 $wifienable 변수 존재 여부
    $WIFI_Setting['wifienable'= $wifienable;
}
if(isset($networkName)){
    $WIFI_Setting['networkName'= $networkName;
}
if(isset($channelselect)){
    $WIFI_Setting['channelselect'= $channelselect;
}
 
fclose($fp);
 
?>
cs


아래는 웹에서 접근했을 때 외부프로그램인 윈도우에서 제공하는 ipconfig 명령어를 수행한 결과를

strchr과 explode를 이용해서 문자열을 파싱해서 값을 얻어오는 부분입니다.

1
2
3
4
5
6
7
8
9
10
11
<?php
 
    $data1 = iconv("EUC-KR""UTF-8", shell_exec("ipconfig"));    // ironmask unicode 문제 해결 2017-09-18
    $data1_token1 = strchr($data1"이더넷");  // 전체 문자열에서 '이더넷' 문자열이 나오는 부분부터 끝까지 값 복사
    $data1_token2 = strchr($data1_token1"IPv4 주소 . . . . . . . . . : ");
    $data1_token3 = explode(" "$data1_token2);    // delimiter로 문자열 자르기
    $data1_Ipv4 = explode("."$data1_token3[12]);    // 원하는 문자열 값 얻기
 
    echo $data1_Ipv4[0] . "." . $data1_Ipv4[1] . "." . $data1_Ipv4[2] . "." . $data1_Ipv4[3];  // IPv4 출력
    
?>
cs


아래는 위 소스에서 사용된 파일을 write하는 내용 입니다.

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
<?php
 
$wifienable = $_POST['wifienable']; // Radio Button
 
$networkName = $_POST['networkName'];                // check box
$networkName_count = count($_POST['networkName']);  // check box 에서 체크된 녀석 count
 
$channelselect = $_POST['channelselect']; // Select Button
 
 
$fp = fopen("wifisetting.txt""w+");
if (!$fp) {
    die("<br/>Failed to open file.");
    echo "<script> alert('Failed to open file.'); </script>";
}
fwrite($fp"wifienable=");
fwrite($fp$wifienable."&");
 
fwrite($fp"networkName=");
fwrite($fp$networkName_count."&"); // 우선은, 체크박스가 1개인 경우는 체크되면 1 아니면 0 
 
fwrite($fp"channelselect=");
fwrite($fp$channelselect);
fclose($fp);
 
echo "<script> window.open('wifi.php', '_self', ' '); </script>";
 
?>
cs




'나는 프로그래머다! > PHP' 카테고리의 다른 글

PHP와 Javascript 동작 개념  (0) 2017.10.17
 

C언어 샘플코드 - 파일입출력과 문자열 파싱

Posted by ironmask84
2017. 10. 17. 08:57 컴퓨터공학/C언어 레퍼런스



2년도 전에 타 블로거의 글을 참고해서 문자열함수에 대해 공유 드린적이 있었습니다.
( http://ironmask.net/198 )

내가 아닌 다른 분이  작성한 것을 참고하는 것은 역시 세월이 지나면,

참고할 때의 기억이 잘 안나는 것 같네요 ㅎㅎ

SW개발 업무를 맡고는 있지만 디버깅하는 업무가 많다보니,

코딩을 할 때 원하는 함수나 문법이 생각이 나지 않을 때가 종종 있습니다.

사실 다루는 프로그래밍 언어도 한 개에 국한되지 않으므로 더욱 혼잡함 ㅜㅜ

아무튼 그래서 기회되는 대로 샘플코드 형식으로 기록도 남기고,

방문자분들에게도 좋은 정보를 제공하도록 하겠습니다. :)


주제 요약 설명

C언어로 파일을 읽어와서

특정 키워드와 비교하는 조건문을 통해,

특정 delimiter로 파싱해서 결과물을 얻는 코드 입니다.

주요 사용 함수는 fopen, fgets, strncmp, strtok 입니다.

C언어의 기본 문법과 함수에 대한 사용법을 어느 정도 숙지하신 것을 

기본 전제로 진행합니다. ^^

샘플 코드

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
Start 2017-10-10
By ironmask 
*/
 
int main( int argc, char* argv[] )
{
    
    char* token;
    char* token2;
    
    char strline[100];    // one line sentence
    int i = 0;
    char* word = "iface eth0 inet static"// keyword
    
    FILE *fp = fopen("../../etc/network/interfaces""r+");
    
    if(fp == NULL){
        puts("FAIL");
        return -1;
    }
    
    
    while(fgets(strline, sizeof(strline), fp)) // 한줄을 읽는데 size 만큼 읽는다.
    {     
        // interfaces File 내에 특정 키워드 찾기
        if(strncmp(strline, word, strlen(word) ) == 0)
        {
            // address
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    // 공백을 delimiter 기준으로 자르기
            token = strtok(NULL" "); // 더 이상 문자열이 없으면 NULL을 반환
            token[strlen(token)-1= '\0';    // gets 함수는 마지막에 \n이 들어가므로 이를 제거하기 위해 널값 삽입
            printf("%s\n", token);
            
            // netmask
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
            
            // broadcast
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
                
            // network
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
            /*
            token2 = strtok(token, ".");
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            */
            
        }    
    
    //    memset( &strline, 0, sizeof(strline) );
    //    printf("hello\n");
    }    
    
    fclose(fp);
    return 0 ;
}
cs


아래는 위 소스에서 사용된 interfaces 파일 내용 입니다.

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
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
 
# The loopback interface
auto lo
iface lo inet loopback
 
# Wireless interfaces
iface wlan0 inet dhcp
        wireless_mode managed
        wireless_essid any
        wpa-driver wext
        wpa-conf /etc/wpa_supplicant.conf
 
iface atml0 inet dhcp
 
# Wired or wireless interfaces
allow-hotplug eth0
auto eth0
iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0
        broadcast 192.168.0.255
        network 192.168.0.0
        up /etc/network/if-up.d/eth0-up.sh
 
allow-hotplug eth1
auto eth1
iface eth1 inet static
        address 10.104.91.15
        netmask 255.255.255.0
        network 10.104.91.0
        gateway 10.104.91.1
        dns-nameserver 156.147.19.132
        up /etc/network/if-up.d/eth1-up-nat.sh
        down /etc/network/if-post-down.d/eth1-down-nat.sh
cs