Search Results for 'Computer Engineering/Embedded System Archictecture'


2 POSTS

  1. 2008.11.02 TCP/UDP Network Protocol
  2. 2008.10.08 Thread 생성과 응답속도

TCP/UDP Network Protocol

Posted 2008. 11. 2. 14:00 by MINOK

1. TCP Network란?

- Transmission Control Protocol

- 인터넷 상의 컴퓨터들 사이에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용되는 프로토콜이다. IP가 실제로 데이터의 배달처리를 관장하는 동안, TCP는 데이터 패킷을 추적 관리한다. 여기서 메시지는 인터넷상에서의 효과적인라우팅을 위해 패킷이라는 여러 개의 작은 조각으로 나누어진다. 예를 들어 HTML파일을 Web Server로부터 사용자에게 보내질 때, 서버 내에 있는 TCP프로그램 계층은 파일을 여러 개의 패킷들로 나누고, 패킷번호를 붙인 다음, IP프로그램 계층으로 보낸다. 각 패킷이 동일한 수신지주고(IP주소)를 가지고 있더라도, 패킷들은 네트ㅡ워크의 서로 다른 경로를 통해 정송될 수 있다. 다른 한쪽 편(사용자 컴퓨터 내의 클라이언트 프로그램)에 있는 TCP는 각 패킷들을 재조립하고, 사용자에게 완전한 파일로 보낼 수 있을 때까지 기다린다.

 

2. UDP Network 란?

- User Datagram Protocol

- IP를 사용하는 네트워크 내에서 컴퓨터들 사이에서 메시지들이 교환될 때 제한된 서비스만을 제공하는 통신 프로토콜이다. UDP는 TCP의 대안이며, IP와 함RP 쓰일 때에는 UDP/IP라고 표현하기도 한다. TCP와 마찬가지로 UDP도 한 컴퓨터에서 다른 컴퓨터로 데이터그램이라고 불리는 실제 데이터 단위를 받기 위해 IP를 사용한다. 그러나 UDP는 TCP와 달리, 메시지를 패킷(데이터그램)으로 나누고, 반대편에서 재조립하는 등의 서비스는 제공하지 않으며, 특히 도착하는 데이터 패킷들의 순서를 제공하지 않는다. 이 말은 UDP를 사용하는 응용프로그램은 전체 메시지가 올바를 순서로 도착했는지에 대해 확인 할 수 있어야한다는 것을 의미한다. 교환해야할 데이터가 매우 적은 네트워크 응용프로그램들은 처리시간단축을 위해 UDP를 사용한다.

 

3. TCP와 UDP의 차이점

TCP : 호스트사이에 세션이 설정되어 승인 및 순차적인 데이터 전송이 보장되며 신뢰할 수 있는 데이터 전송만을 보장한다. 때문에 더 느리고 더 많은 오버헤드가 필요하며 지점 간 통신만 지원한다.

-연결형 방식, 점대점 통신

-보장성서비스제공(flow control, error control, congestion(체증) control)

-Full Duplex 통신, Graceful 연결해제

-Byte(stream)-Oriented → segment 단위로 전송하지만 stream of byte로 취급되고 따라서 모든 Bytes는 번호가 붙여진다.

 

UDP : 호스트사이에 세션이 설정되지 않는 연결 없는 서비스이기에 승인 및 순차적인 데이터 전송이 보장되지 않는다. 더 빠르고 오버헤드가 적게 필요하며 지점 간 통신과 지점 대 다중 지점 간(point-to-multipoint)통신을 지원한다.

-비연결형 방식

-비보장성 서비스 제공

-Datagram-Oriented

 


4. Source Code Analyze

◎ TCP/IP - Server

#include "stdio.h"

#include "string.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int serversock, clientsock;

struct sockaddr_in serveraddr, clientaddr; //socket open

 

int addr_len = sizeof(struct sockaddr);

char buf[1024];

int recv_count;

 

if( (serversock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

 

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(2006);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

//Bind

if( bind(serversock, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("bind");

exit(-1);

}

//Listen

if( listen(serversock, 0) < 0 )

{

perror("listen");

exit(-1);

}

 

printf("listening...\n");

//Accept

clientsock = accept(serversock, (struct sockaddr*)&clientaddr, &addr_len);

printf("connected from %s[%d]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

 

while(1)

{

recv_count = recv(clientsock, buf, 1024, 0);

if(recv_count == -1)

break;

printf("%s\n", buf); //수신된 메시지를 출력한다.

send(clientsock, buf, 1024, 0); //수신된 메시지를 재전송한다.

}

 

//socket close

close(clientsock);

close(serversock);

return 0;

}

 

◎ TCP/IP - Client

#include "stdio.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int client;

 

//socket open

struct sockaddr_in serveraddr;

struct sockaddr_in clientaddr;

char buf[1024];

 

if( (client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )

{

perror("socket");

exit(-1);

}

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(2006);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

//Connect

if( connect(client, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("connect");

exit(-1);

}

 

while(1)

{

printf("input your data : ");

memset(buf, 0, 1024);

gets(buf); //입력받은 문자열 저장

if(strcmp(buf, "exit") == 0) //exit문자열과 비교 같을 때 빠져나감

break;

 

send(client, buf, 1024, 0); //저장된 문자열 송신

memset(buf, 0, 1024);

recv(client, buf, 1024, 0); //재전송된 메시지 수신

printf("echo data : %s\n", buf); //재전송된 메시지 출력

}

close(socket); //socket close

return 0;

}

 

 

◎ UDP/IP - Server

#include "stdio.h"

#include "string.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int serversock;

 

//socket open

struct sockaddr_in serveraddr, clientaddr;

 

int addr_len;

char buf[1024];

int recv_count;

 

if( (serversock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

 

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(9000);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

 

//bind

if( bind(serversock, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("bind");

exit(-1);

}

 

printf("Waiting...\n"); //대기메시지 출력

 

while(1)

{

addr_len = sizeof(clientaddr);

 

//recvform

recv_count = recvfrom(serversock, buf, 1024, 0,(struct sockaddr*)&clientaddr, &addr_len);

if(recv_count == -1)

break;

 

printf("%s\n", buf); //수신메시지 출력

//sendto 수신된 메시지 재전송

sendto(serversock, buf, 1024, 0,(struct sockaddr*)&clientaddr, sizeof(clientaddr));

}

 

close(serversock); //socket close

return 0;

 

}

 

◎ UDP/IP - Client

#include "stdio.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int client;

//socket open

struct sockaddr_in serveraddr;

 

char buf[1024];

 

if( (client = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(9000);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

 

 

while(1)

{

printf("input your data : ");

memset(buf, 0, 1024);

gets(buf); //입력받은 문자열 저장

if(strcmp(buf, "exit") == 0) //exit문자열과 비교 같을 때 빠져나감

break;

//sendto 저장된 문자열 server부로 전송

sendto(client, buf, 1024, 0,(struct sockaddr*)&serveraddr, sizeof(serveraddr) );

 

 

memset(buf, 0, 1024);

recvfrom(client, buf, 1024, 0,NULL,NULL);//server로부터 재전송된 메시지수신

printf("echo data : %s\n", buf); //재전송된 메시지 출력

}

close(socket); //socket close

return 0;

}

 

 

 

'Computer Engineering > Embedded System Archictecture' 카테고리의 다른 글

Thread 생성과 응답속도  (0) 2008.10.08

Thread 생성과 응답속도

Posted 2008. 10. 8. 22:14 by MINOK

 

-자식 쓰레드를 생성하여 child Event 발생 시 소요되는 시간 측정하는 프로그램이다.

#include <iostream>

#include <windows.h>

#include <winbase.h>

using namespace std;

 

HANDLE hResumeMain;

HANDLE hResumeChild;

LARGE_INTEGER loop_count;

LARGE_INTEGER freq; //counts per sec

LARGE_INTEGER time1; //counts

LARGE_INTEGER time2; //counts

LARGE_INTEGER total_time; //counts

BOOL mission_accomplished = false;

DWORD WINAPI ChildThreadRoutine( LPVOID lpParam );

 

int main(int argc, char* argv[])

{

 

loop_count.QuadPart = 0; //변수 초기화

total_time.QuadPart = 0;

 

QueryPerformanceFrequency(&freq); //주파수 측정 함수

HANDLE myProc = GetCurrentProcess(); //현재 프로세스의 핸들 저장

SetPriorityClass(myProc, REALTIME_PRIORITY_CLASS);

//우선순위 변경.실시간 우선순위로.

 

//CreateEvent 함수는 네개의 인자를 가지는데,

//첫번째는 생성된 핸들을 자식 프로세스가 상속받도록 하겠느냐

//두번째는 이벤트를 자동으로 리셋시킬것이냐 아니냐

//세번째는 초기값이 시그널이냐 아니냐

//네번째는 이벤트의 이름을 스트링으로 주는것으로

//각각의 이벤트 객체를 생성

hResumeMain = CreateEvent(NULL, FALSE, FALSE, NULL);

hResumeChild = CreateEvent(NULL, FALSE, FALSE, NULL);

 

HANDLE hChild = CreateThread(NULL, 0,

(LPTHREAD_START_ROUTINE)ChildThreadRoutine,NULL, 0, NULL); //자식 쓰레드 생성

 

SetThreadPriority(hChild, THREAD_PRIORITY_TIME_CRITICAL);

//자식 쓰레드의 우선순위 최상위로 상승시킴.

 

while(!mission_accomplished) //초기값에 따라 while문 실행 여부결정

//초기값이 false 이므로 수행.

{

QueryPerformanceCounter(&time1); //timer1 시간 측정

//child 이벤트 발생 ->ChildThreadRoutine() 호출

SetEvent(hResumeChild); //hResumeChild 객체를 signaled 상태로 만듬

WaitForSingleObject(hResumeMain, INFINITE); //이벤트의 발생대기.

}

 

//초당 주파수 출력

cout << "counts per second: " << freq.QuadPart << endl

<< "total counts: " << total_time.QuadPart << endl // 응답시간의 합

<< "total ?? : " << loop_count.QuadPart << endl //child이벤트발생 수

<< "avg ?? time: " //평균 반응 시간을 micro second(us) 단위로 출력

<< (double)total_time.QuadPart / loop_count.QuadPart * 1000000 / freq.QuadPart<< "us" << endl;

while (getchar() != 'E')

continue;

 

return 0;

}

 

DWORD WINAPI ChildThreadRoutine( LPVOID lpParam )

{

while(!mission_accomplished)

{

WaitForSingleObject(hResumeChild, INFINITE); //이벤트의 발생대기.

 

QueryPerformanceCounter(&time2); //timer2의 시간 측정

total_time.QuadPart += (time2.QuadPart - time1.QuadPart); //총 반응 시간를 구한여 저장.

loop_count.QuadPart++; //카운트 증가

if (total_time.QuadPart >= freq.QuadPart) //조건(총반응시간 >= 빈동수) 부합 시 종료

mission_accomplished = TRUE;

SetEvent(hResumeMain); //이벤트 발생

}

return 0;

}




 

step1> 초당 주파수를 구하고 현재 프로세스 우선순위를 실시간으로 변경하고 프로세스 핸들을 얻는다.

 

step2> 자식 쓰레드를 생성하여 우선순위를 높여준다.

 

step3> main()에서 현재시간을 측정하고 child Event 발생한다.

 

step4> 이 때 시간을 재측정하여 이전시간과의 차이(자식 쓰레드 응답시간)를 구한다.

 

step5> 여러 차례 측정하여 합을 구한다. 이 값이 1단계에서 구한 초당 주파수 보다 크면 주파수, 응답시간, child event 발생횟수, 평균반응속도 출력한 후 프로그램을 종료한다.


'Computer Engineering > Embedded System Archictecture' 카테고리의 다른 글

TCP/UDP Network Protocol  (0) 2008.11.02