IT

'소프트웨어/네트워크'에 해당되는 글 3건

  1. 2011.07.15 send, sendto, write, recv, recvfrom, read
  2. 2011.07.15 소켓 통신
  3. 2011.07.12 Little Endian / Big Endian

리눅스에서 소켓 통신을 할 때

데이터 전송 함수로 send, sendto, write를 사용 할 수 있다.

그림입니다.
원본 그림의 이름: k1.bmp
원본 그림의 크기: 가로 588pixel, 세로 63pixel

함수 원형에서 알 수 있듯이

send 함수와 write 함수는 보내는 상대방의 IP주소를 지정 할 수 없다.

그렇기 때문에 연결지향 방식인 TCP 통신일 때 사용이 가능하다.

또한 write 함수는 flag를 지정 할 수 없기 때문에 단순한 전송만 가능하다.


sendto 함수는 상대방의 IP주소를 지정 할 수 있기 때문에

UDP 통신에서 주로 사용한다.(TCP에서도 사용할 수 있다.)


MSG_OOB

oub-of-band data를 이 개념을 지원하는 소켓으로 보낸다.

      

      MSG_DONTROUTE

패킷을 전송하는데 게이트웨이를 사용하지 않고 직접 연결된 네트워크를 통해서 호스트로 보낸다. 이것은 diagnostic 혹은 routing 프로그램에 의해서만 사용한다.

      MSG_DONTWAIT

non-blocking을 가능하게 한다.

      

      MSG_NOSIGNAL

다른 한쪽의 소켓의 연결이 끊겼을때, 소켓으로부터 발생하는 스트림상의 SIGPIPE를 보내지 않도록 요구한다. 그러나 EPIPE에러는 여전히 반환된다.



※ recv, recvfrom, read 역시 동일하다.

write, read로 네트워크 통신이 가능한 이유는 리눅스에서는 모든 장치를 하나의 파일로 보기 때문이다. 네트워크의 소켓도 일종의 파일로 보기 때문에 가능하다.



Out-of-band 데이터의 정의


- 대역밖의 데이터

- 긴급한 데이터로서 일정한 순서를 가지지 않고 순차화 된 데이터보다 더 먼저 처리 되어야 할 필요가 있는 데이터를 일컫는다. 즉, TCP/IP 통신상에서 긴급한 데이터



⑴ 데이터 송신용 시스템 호출

�� write Stream 소켓을 통해  데이터 송신

�� send Option을 규정하는  데이터 송신(Stream 소켓)

�� sendto Datagram 소켓을 통해  데이터 송신


⑵ 데이터 수신용 시스템 호출

�� read Stream 소켓을 통해 데이터 수신

�� recv Options을 규정하는 데이터 수신(Stream 소켓)

�� recvfrom Datagram 소켓을 통해 데이터 수신

'소프트웨어 > 네트워크' 카테고리의 다른 글

소켓 통신  (0) 2011.07.15
Little Endian / Big Endian  (0) 2011.07.12
Posted by sinpk

그림입니다.
원본 그림의 이름: clip_image001.png
원본 그림의 크기: 가로 1510pixel, 세로 784pixel


struct sockaddr

{

        unsigned short sa_family;       /*인터넷 주소 패밀리  2byte*/

                char sa_data[14];               /* port 번호(short형 : 2byte) + ip 주소 (long형 4byte)*/

};

그림입니다.
원본 그림의 이름: k1.png
원본 그림의 크기: 가로 984pixel, 세로 162pixel


struct socketaddr_in

{

unsigned short sin_family;       /* Internet protocol */

unsigned short sin_port; /* Address port (16bits) */

struct in_addr sin_addr; /* Internet address (32bits) */

char sin_zero[8]; /* Not used */

};


socketaddr_in으로 사용자에게 값을 입력받아 sockaddr 자료형으로 변환하여 사용

그림입니다.
원본 그림의 이름: 그림1.png
원본 그림의 크기: 가로 985pixel, 세로 268pixel

Intel 계열 CPU는 Little Endian 방식 채택

네트워크에서는 BIG Endian 방식 채택

그림입니다.
원본 그림의 이름: CLP000009d40a49.bmp
원본 그림의 크기: 가로 386pixel, 세로 386pixel


예제

#include <stdio.h>

 

int main(void)

{

        short host_port_order= 0x1234;

        short net_port_order;

 

        long host_add_order = 0x12345678;

        long net_add_order;

 

        net_port_order = htons(host_port_order);

        net_add_order = htonl(host_add_order);

 

        printf("Host ordered port : %x \n", host_port_order);

        printf("Network ordered port : %x \n\n", net_port_order);


inet_addr()

그림입니다.
원본 그림의 이름: CLP000009d40001.bmp
원본 그림의 크기: 가로 606pixel, 세로 130pixel


inet_addr() 예제

#include <stdio.h>

#include <arpa/inet.h>

 

int main()

{

        char* addr1 = "1.2.3.4";

        char* addr2 = "1.2.3.256";

        unsigned long conv_addr;

 

        conv_addr = inet_addr(addr1);

        if(conv_addr==INADDR_NONE)

        printf("error occur : %d \n", conv_addr);

        else

        printf("unsigned long addr(network ordered) :

        %x \n", conv_addr);

 

        conv_addr d= inet_addr(addr2);

        if(conv_addr==INADDR_NONE)

        printf("error occur : %d \n", conv_addr);

        else

        printf("unsigned long addr(network ordered) :

        %x \n", conv_addr);

 

        return 0;

}


inet_aton 예제

#include <stdio.h>

#include <arpa/inet.h>

 

void error_handling(char* message);

 

int main()

{

        char *addr = "1.2.3.4";

        struct sockaddr_in addr_inet;

 

        if(!inet_aton(addr,&addr_inet.sin_addr))

        error_handling("ERROR");

 

        printf("unsigned long address(network orderd)

        : %x \n\n",addr_inet.sin_addr.s_addr);

 

        return 0;

}

 

void error_handling(char *message)

{

        fputs(message, stderr);

        fputs('\n',stderr);

        exit(1);

}


1. inet_addr()함수

이 함수는 Dotte-Decimal Notation 형식을 빅엔디안 32비트 값으로 변환시켜줍니다.

unsigned long inet_addr(const char *string);

위가 함수의 원형인데 함수 파라미터 값에 IP주소 문자열의 시작주소를 넣어주면 이 함수가 알아서 빅엔디안 32비트 unsigned long 형의 값으로 만들어줍니다.

성공하면 빅엔디안 형식의 32비트 값을, 실패하면 INADDR_NONE을 리턴합니다.

INADDR_NONE은 실제로 -1로 선언되어 있습니다.


2. inet_aton()함수

이 함수는 기본적으로 주소 문자열을 빅엔디안 32비트 값으로 변환 시켜주는건 inet_addr()함수와 같지만 다른 점이 있습니다.

inet_addr()함수는 변환된 값을 sockaddr_in 구조체의 맴버변수 안에 또 선언된 in_addr 구조체에 값을 대입해주어야 합니다. 하지만 inet_aton()함수는 자동으로 값을 대입시켜줍니다.

따라서 따로 대입해야 할 필요가 없어집니다. 먼저 이것이 함수의 원형입니다.

int inet_aton(const char *string, struct in_addr *addr);

첫번째 파라미터 값은 주소 문자열이 있는 포인터변수가 들어가고 두번째 파라미터 값은 구조체 맴버변수중 주소값이 들어가는 맴버변수의 주소값을 넣어주시면 됩니다. 

함수를 성공시키면 0이 아닌값, 실패하면 0이 리턴됩니다.

이 함수는 inet_addr()함수보다 편리하게 사용할 수 있습니다.


서버에서 접속하는 클라이언트 주소 출력하기

struct sockaddr_in client_addr;  //선언


클라이언트주소는 client_addr.sin_addr.s_addr   저장되어있는것을

ntohl를 사용하여 Little Endian 방식으로 바꿔서 출력

서버의 연결에 따른 분류

1.   연결형 서버 : TCP를 이용

2.   비연결형 서버 : UDP를 이용


서버의 서비스에 따른 분류

1. Iterative 서버

- 클라이언트의 서비스 요구를 순서대로 처리해 주는 서버

- request 처리시간이 짧거나 별로 문제가 되지 않는 경우에 사용

- Iterative 서버는 프로그램 구현이 비교적 간단

2. Concurrent 서버

- 여러 요구를 동시에(concurrently) 서비스할 수 있는 서버

- 새로운 클라이언트가 접속될 때마다 서비스를 담당할 프로세스를 새로 만드는 방법이 있으나 이 방법은 클라이언트 수가 늘어남에 따라 프로세스 수도 계속 늘어남

하나의 프로세스가 여러 서비스를 동시에 처리 방법 apparent concurrent 서버


Iterative 서버 예제

그림입니다.
원본 그림의 이름: clip_image001.jpg
원본 그림의 크기: 가로 531pixel, 세로 212pixel

1.   하나의 클라이언트가 접속을 하면 connect함수를 호출하면 연결

2.   서버의 연결요청 대기 큐에 들어감

3.   accept 함수가 한 개씩 소켓을 생성하여 connetc함수를 클라이언트에게 리턴해주면 연결완료

'소프트웨어 > 네트워크' 카테고리의 다른 글

send, sendto, write, recv, recvfrom, read  (0) 2011.07.15
Little Endian / Big Endian  (0) 2011.07.12
Posted by sinpk

PC Intel : Little Endian

예) 0x12345678

주소

78

1000

56

1001

34

1002

12

1003

주소는 ↓순으로 높다


Network : Big Endian

예) 0x12345678

주소

12

1000

34

1001

56

1002

78

1003


htonl = Host to Network Long형

htons = Host to Network Short형


ntohl = Network to Host Long형

ntohs = Network to Host Short형

'소프트웨어 > 네트워크' 카테고리의 다른 글

send, sendto, write, recv, recvfrom, read  (0) 2011.07.15
소켓 통신  (0) 2011.07.15
Posted by sinpk