블로그 이미지
송시혁

calendar

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

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

2013. 7. 4. 16:22 네트워크/vmware 실습








fcntl()함수


이 함수를 이용하여 블로킹을 논 블로킹으로 만들 수 있다.

소켓에 들어오는 정보를 알수 있다.






어제 만든 udp서버 소스에서 아래 fcntl함수를 추가하였다.

첫번째 fcntl)함수에서 소켓에 getpid()함수를 써서 현재 프로세서ID가 무엇인지 알 수 있다. 





UseIdelTime();함수를 호출하면 sleep(3)함수에 의해 2초 마다 '.'을 찍어낸다. 서버에 아무런 정보도 들어오지 않을 때는 이 점만찍어낸다. 



다음은 핸들러 함수 부분. 





























멀티태스킹


pid_t는 int형이다. typedef에 의해서 pid_t는 int형이다.

uiMomid를 선언한다. 그이유는 부모 프로세서를 알기위해서 변수를 선언하여  getpid()함수를 사용하여 부모의 프로세서가 뭔지 

알게 한다.




while문안에서 if문에서 getpid()함수와 uiMomid와 비교하여 같으면 if문을 실행한다.

accpet()함수는 랑데뷰 소켓을 생성한다. 그와 동시에 클라이언트 소켓을 생성한다.

fork();함수가 호출되면, 프로세서를 둘로 나눈다? 부모 프로세서와 차일드(child)자식 프로세서로 나눈다.

그리고 다시 if문안에 if문 else문에서 close()함수를 쓰는데 하나는 랑데뷰, 하나는 클라이언트를 닫아야한다.

자식 프로세서가 랑데뷰를 쓰지 않으므로 닫아야 한다. 반대로 부모프로세서는 accept()함수가 생성한 클라이언터 sock을 닫아야 한다.

그래서 getpid()함수와 uiMomid변수를 비교하여 조건식으로 써서 구성하였다. 그리고 큰 else문은 프로세스를 처리하는 부분이라고 생각하면 된다.

실제로 클라이언트와 메신저를 보내고 받을 수 있는 것이다. 지난, 시간에 배웠으므로 자세한 설명은 생략.



실행결과






'네트워크 > vmware 실습' 카테고리의 다른 글

7월 5일 thread()함수를 이용한 소스  (0) 2013.07.05
7월 5일 thread()개념  (2) 2013.07.05
7월 3일 비동기식 udp(정리중)  (0) 2013.07.03
7월 2일 signal 신호  (0) 2013.07.02
7월 1일 zterm 3handshake개념  (1) 2013.07.01
posted by 송시혁
2013. 7. 3. 22:02 네트워크/vmware 실습




아래 소스는 서버부분이다. 이번에는 udp방식으로 서버를 구현하였다. 







소켓을 생성하고 memset()함수 호출, 그리고 구조체 설정 bind()함수 호출부분은 저번시간에 구성한 tcp서버와 동일하다.

그러나 listen()함수와 accept()함수가 보이지 않는다. 그이유는 udp는 tcp와는 달리 구체적으로 세밀하게 데이터를 연결 송수신을 하지 않는다. 그래서 필요없다. 장점은 속도는 빠르다. 그러나 단점으로 정확성이 떨어진다. 데이터를 보내고 상대측에서 받아도 그만, 안 받아도 그만인 형식. 그냥 데이터를 보내면 역할이 끝난다. 이부분이 tcp와 다른 점이자, 단점이라고 할 수 있다.


위의 sigaction부분은 당연히 ctrl+c를 눌렀을 때 정상종료 하도록 구현한 것이다. 어제 배운것이므로 설명을 생략.



핵심부분은 while문안에 있는 recvfrom()함수가 되겠다.



1.첫번째 인자는 소켓

2. 두번째 인자는 버퍼. 데이터를 저장하는 메모리

3. 인자는 버퍼의 크기가 되겠다.

4.flag

5. 구조체 설정의 주소. 클라이언트로 부터 데이터를 받으면, 데이터를 저장하는 주소. (상대방 주소)

6. 4번째 인자의 데이터 저장의 크기, 그러나 그냥 sizeof()연산자로 크기를 지정못함. 그 이유는 함수 원형이 &이다.

    그래서 while()문 위에 cliAddrLen=sizeof(echoClntAddr);이 존재한다. cliAddrLen을 5번째 인자로 지정하였다. 


그리고 아래 smart()함수는 핸들러 함수가 되겠다. 여기서는 네트워크상의 패키지를 보는 pcap이 아닌, 서버이기 때문에 그냥 close(sock);을 한다.




클라이언트 부분.





위의 설정 부분은 동일하다. 


여기서의 핵심은 sendto()함수이다. 일단, read()함수로 키보드로 보내고자 하는 데이터를 입력받는다.

sendto()함수

첫 번째는 소켓. 두번째, 버퍼, 세번째 인자는 read()함수에서 

네번째와 , 다섯번째 인자는 위에 recvfrom()함수와 동일하다.



아래는 실행결과 



'네트워크 > vmware 실습' 카테고리의 다른 글

7월 5일 thread()개념  (2) 2013.07.05
7월 4일 멀티태스킹과 프로세스 fork()함수  (0) 2013.07.04
7월 2일 signal 신호  (0) 2013.07.02
7월 1일 zterm 3handshake개념  (1) 2013.07.01
6월 28일 L3부분2.  (0) 2013.06.28
posted by 송시혁





어제 소스에서 다른변수를 한 개 더 생성하고 다른 함수를 만들러 핸들러 함수로 등록한다.

아래그림을 보면 smart1()함수를 한 개 더 만들었다.





그리고 함수 sigaction()함수를 더 만들어서 첫번째 인자에 SIGTERM을 넣는다.



SIGTERM은 명령어에 kill을 이용하여 종료시키는 방버이다.




아래는 실행화면이다. 먼저 pcap소스를 먼저 실행시킨다. 빨간색 네모부분이다.


그리고 새창에서 ps -A |grep ex2를 친다. 여기에서 ps는 A는 all을 뜻한다. '|' or기호는 왼쪽에 있는 명령어에서 오른쪽에 있는 명령어를 

수행한다는 뜻이다. grep은 특정한 것을 실행시키기 위한 단어이고 ex2는 필자가 소스를 구성한 소스 파일이다.

(파란색 네모부분)





그러면 아래그림과 같이 실행화면이 뜬다.



























posted by 송시혁
2013. 7. 2. 16:13 네트워크/vmware 실습



sigaction()함수와 그에 대한 구조체를 알아본다.


구조체 

struct sigaction

{

void (* sa_handler)(int);

sigset_t sa_mask;

int sa_flags;

};

첫번째 멤버는 함수 포인터. 이  소프트웨어 인터럽트 함수라고 생각하면 된다.

여기서는 singnal이라고 부른다.

자바 - event, 리눅스 - signal 윈도우- message


2번째 멤버는 들러 함수가 호출되는 동안 신호를 블로킹하는 멤버

 이 두번째 멤버에서 또 다시 여러가지 형태의 블로킹 함수가 존재한다.

1. sigemptyset()//블로킹을 셋팅하는데 해당하는 것만 블로킹.

2. sigfillset(sigset_t * set)//전부 블로킹, 인자는 sigset_t형의 포인터형이므로 주소를 인자로 받아야함.

3. sigaddset()//블로킹 추가

4. sigdelset()//블로킹을 지운다.


3번째 멤버는 sigaction 함수인자의 첫 번째 인자를 처리되는 방식을 추가적으로 제어.

 여기서는 쓰지 않아서 0으로 해준다.


아래 변수선언부분을 자세히 보면, 구조체형 변수를 선언한 다음.

핸들러 함수인 smart()함수의 주소를 첫번째 멤버인 함수 포인터에 넣는다.

그러면 핸들러 함수가 해당 함수의 주소에 가서 그 함수를 실행한다.

위 그림은 전체 소스 struct부분을 자세히 설명하면 다음과 같다.





아래는 smart()함수이다. 이것을 만든 부분이다. 핸들러가 이 함수를실행한다.

그리고 실행이 끝나면 종료 된다. exit(0)에 의해서 , exit(0)이 없다면 종료되지 않는다. 즉, 기존의

ctrl+c를 누르면 강제종료되던 것이 종료는 되지 않는다.




sigaction()함수- 이 함수를 호출하고 어떻게 설정하느냐에 따라서 디폴트 동작을 변경할 수 있다.

첫번째 인자는 signal신호를 인자로 받는다.


신호

1.SIGALRM   유발사건: 경보타이머의 만료              디폴트 동작:종료

2.SIGHLD     유발사건: 자식 프로세스빠져 나옴.      디폴트 동작:무시

3.SIGINT       유발사건: 인터럽트 문자(cltr -c)입력   디폴트 동작:종료

4.SIGIO        유발사건:  소켓 입.출력 준비 완료      디폴트 동작:무시

5.SIGPIPE     유발사건:   닫힌 소켓을 쓰려고 시도   디폴트 동작:종료


여기서 우리가하고자 하는 것은 ctrl+c를 눌러도 강제종료가 아닌, 정상종료를 처리하게 하는 것이다. 

그래서 당연히 SIGINT를 쓴다.


두번째 인자는 struct sigaction형 포인터, newaction , 세번째 인자는 oldaction인자.

즉 새로운 설정하는 부분과  기존의 설정을 백업하는 인자이다.

여기서는 두 번째는 당연히 구조체의 주소를 인자로 받는다.백업하는게 없으므로 세번째 인자의 0으로 설정.


실행결과 화면.


ctrl+c를 누르면 종료가 되는것은 마찬가지 이지만, 강제 종료가 아닌 정상종료이다.

그것이 의심간다면, 아까만든 함수인 smart함수에서 exit(0)를 지운다면, 종료가 되지 않는다.

그렇기 때문에 이 코드는 정상종료가 맞다.





posted by 송시혁
2013. 7. 1. 16:47 네트워크/vmware 실습





위의 그림중 첫 번째 if문은 에러처리부분.

2번 째 if문 본인의 ip주소와 비교하는 부분이다. 이것과 비교하여 0이면, strcmp()함수는 정상 종료이면 0을

반환한다. 0이 아니면, 비정상 종료.

그리고 tcp와 ip가 

세 번째 if문에서 tcp의 source와 dest가 포트번호 9999와 같지 않으면, 에러처리. 즉, 포트번호 9999일 때, 반응하도록

설계함.


위의 그림은 원래 L3_IP함수에서 잘라내어 붙여온 그림.



위 그림은 main()함수.



3handshake (3핸드쉐이크)






이 두개의 그림은 서로 동일한 설명을 하고 있다.


1. 송신측을 client, 수신측을 서버이다. 클라이언트가 먼저 서버로 신호를 보낸다. 그러면, 클라이언트의 syn bit와 act bit의 반응을 잘 살펴봐야 한다. 이때는 시퀀스(sync)비트가 1(여기서의 1은 신호)이 된고 ack비트는 0이 된다.


2. 네트워크 프로토콜에 의해서 syn을 받으면 반드시 ack를 돌려주어야 한다. 따라서 서버에서 ack을 돌려준다. 그런데 이상한 점은 syn또한 같이 주고 있다는 점이다. 여기서 주목해야 할 부분이다.


3. 시퀀스를 받았으므로 다시 ack을 돌려준다. 여기서 기존의 ack에서 +1한 만큼 더해서 보내진다. 결과 참고.





실행결과 1. 클라이언트가 처음 서버로 송신한 결과.

id번호, 그리고 시퀀스의 넘버가 보인다. 당연히 ack은 없기때문에 0이다.(참고로 번호는 난수 생성, 랜덤이다.)





2. 서버에서 받아서 다시 클라이언트로 보내는 부분.

id는 0이며, 시퀀스 넘버와 ack넘버가 둘 다 존재한다. 여기서 ack넘버를 잘 보면 위의 클라이언트의 시퀀스넘버에서 +1 더해진 값임을 알수 있다.






3.클라이언트에서 다시 ack을 전송하여야한다. 그래서 ack은 기존에 시퀀스넘버에서 1 더한 값이 아래 ack넘버로

들어가 있다. 여기서는 시퀀스는 0이 되어야 정상이다. 아래 그림은 시퀀스넘버에 기존에 있던 ack넘버가 그대로 들어왔다.

무언가 에러다. 원래는 여기에서 시퀀스는 0이 되어야 정상이다.







'네트워크 > vmware 실습' 카테고리의 다른 글

7월 3일 비동기식 udp(정리중)  (0) 2013.07.03
7월 2일 signal 신호  (0) 2013.07.02
6월 28일 L3부분2.  (0) 2013.06.28
6월 27일 패킷 분석 ip헤더와 tcp헤더1  (0) 2013.06.27
6월 26일  (0) 2013.06.26
posted by 송시혁
2013. 6. 28. 16:04 네트워크/vmware 실습























'네트워크 > vmware 실습' 카테고리의 다른 글

7월 2일 signal 신호  (0) 2013.07.02
7월 1일 zterm 3handshake개념  (1) 2013.07.01
6월 27일 패킷 분석 ip헤더와 tcp헤더1  (0) 2013.06.27
6월 26일  (0) 2013.06.26
6월 25일 패키지 분석1 응용 L1 헤더부분.  (0) 2013.06.25
posted by 송시혁
2013. 6. 27. 17:28 네트워크/vmware 실습



ip헤더 구조



ip.h헤더파일




stIp= struct ip자료형, ip.h파일에 정의 되어있는 자료형이다. 

usCehecksum을 unsigned short형의 자료형. ip.h에 checksum에 해당하는 ip_sum을 변수 usCehecksum에 집어넣는다.

stIp->ip_sum=0x0000;은 앞에 2바이트 네자리를 0으로 채운다. 

아래 printf문에서 조건 연산식을 써서 uschecksum이 함수 smart_cksum과 같은 경우에 yes, 거짓이면, no를 출력한다.

(usChecksum==smart_cksum(stIp->ip_hl)*4)?"yes":"no"); 이부분이다. 



smart()함수

인자로 stIp와 (stIp->ip_hl)*4를 받는다.

아래그림을 보면 알수 있듯이 헤더의 크기이다. (ip_hl)


처음 for문에서 (stIp->ip_hl)*4헤더의 크기만큼 돈다. ulSum에 stIp를 더한다.

함수의 첫번째 인자가 void *vp이고, stIp는 unsigned short형이기 때문에 캐스팅을 시켰다. *((unsigned short *)vpData;

vpData를 +1하여 크기만큼 주소를 이동한다. 

다음 ulSum= >>16번 오른쪽으로 당기고, 그것을 0과 마스킹하여 1이 된 숫자를 더한다.

그리고 다시 ulSum을 더하고 그것을 반전시킨 값을 반환한다.

checksum은 ip헤더가 변경되었는지 되지 않았는지를 체크하는 것이다. 위의 smart_cksum함수는 그것을 체크하기위한

알고리즘이고 위의 printf문에 의해 조건연산을 하여 확인이 되면,ok, 그렇지 않으면 fail을  화면에 출력된다.


그리고 src와 des부분. ip에도 보내고 받는 주소를 나타낸다. 먼저 ip에서는 먼저 보내는 source ip adress가 먼저 나와있다. 헤더파일에서 src와 des부분에 해당하는 파일을 보고 printf문으로 찍어낸다. ip는 "192.000.00.xx"자체가 문자열이므로 %s로 찍어내는데 문제는 ip를 네트워크상의 문자를 아스키코드 문자로 변환하여야 한다. 그래서

inet_ntoa()함수를 쓰고 인자에 stIp->src와 stIp->des를 썼다. printf문을 2개씩 나누어 사용한 이유는 한줄에 쓴다면

ip주소를 덮어쓰기 때문이다. inet_ntoa()함수에 원형에는 static변수가 선언이 되어있으며, ip주소를 저장하는 buffer가 존재한다. static변수는 한 번만 초기화된다. 그래서 src에서 ip주소를 받아서  버퍼에ㅣ 쓰면, des에서 받는 ip주소가 출력이

되어야 하는데 static변수에 의해서 이전의 ip가 그대로 buffer에 덮어버린다. 그래서 printf문을 나누어서 사용하였다. 





아래의 L3_TCP함수를 주목한다. 

tcp헤더부분을 완성시키기위한 함수를 만든것이다. 아래의 그리미을 보면, sourceport와 

destination port가 있다. 

tcp.h헤더파이을 참조하여 구조체 포인터형 변수 *stTcp를 만들었다. 그리고 바로 이것을 void형 vp를

캐스팅하여 대입한다. 

그리고 printf문으로 각각, source와 dest를 화면에 출력하였다.




















'네트워크 > vmware 실습' 카테고리의 다른 글

7월 1일 zterm 3handshake개념  (1) 2013.07.01
6월 28일 L3부분2.  (0) 2013.06.28
6월 26일  (0) 2013.06.26
6월 25일 패키지 분석1 응용 L1 헤더부분.  (0) 2013.06.25
6월 24일 패키지 분석 실습(미완성)  (0) 2013.06.24
posted by 송시혁
2013. 6. 26. 12:04 네트워크/vmware 실습

















posted by 송시혁
2013. 6. 25. 15:59 네트워크/vmware 실습









memcpy()함수 설명

첫 번째 인자는 버퍼, 두 번째인자는 세 번째 인자는 크기



L1에 해당부분. 빨간색 네모 12이트, 2바이트 08 00

L2 파란색 네모 45 00 목적지






switch case문 



일단 아래그림을 참고한다. 이것은 cd/linux/엔터

vi if_ether.h를 치면 아래와 같은 그림이 있다.


이것을 main()함수에 케이스문에 각각 붙여넣는다.



실행결과


mac adress주소가 나온다. 이것은 (윈도우)ip를 나타낸다.

packet type은 IP부분 즉, 0800부분이다.




posted by 송시혁
2013. 6. 24. 16:08 네트워크/vmware 실습




pcap_open_live()함수는 네트워크상의 패킷들을 보기위해서 패킷 캡쳐설정을 하는 함수.




2번째는 캡쳐가능한 최대 크기 여기서는 1500바이트로 설정.

3번째 인자는 1로 설정하면, 모든 패킷을 받고 0으로 하면, 특정 패킷만 받는다. 받을 때까지 기다리는 함수

4번째는 블로킹되는 만큼의 시간.(timeout)

5번째 인자는 에러시 저장되는 버퍼, 보통의 경우 0,null로 설정한다.


char *cpNIC_Name변수에 pcap_lookupdev(errbuf)를 넣는다.

cpNIC_Name은 에러시 0을 반환하므로 if문에 0과 같으면이라는 조건을 주고 에러처리(종료) 하였다.




위에 두줄을 복사하여 붙여 넣었다.






pcap_lookupdev()함수는 에러시 널(0)을 반환한다.

이 함수는 네트워크상의 별명(alias)를 리턴한다.




이 함수도 마찬가지로 마찬가지로 에러시 NULL을 반환.




pcap()함수의 CLOSE()함수.


posted by 송시혁
prev 1 ··· 4 5 6 7 8 next