목차
* UNIX system에서 pipe, socket 이란 무엇인가?
* 그 application이란 무엇인가?
1. UNIX system 에서의 pipe
1) 파이프의 정의
2) 명령어 수준에서의 파이프
3) 예제
2. UNIX system 에서의 socket
1) socket의 정의
2) 연결의 유형
3) 주소지정
4) socket 인터페이스
5) 트랜스 포트 엔드 포인트의 생성
* 그 application이란 무엇인가?
1. UNIX system 에서의 pipe
1) 파이프의 정의
2) 명령어 수준에서의 파이프
3) 예제
2. UNIX system 에서의 socket
1) socket의 정의
2) 연결의 유형
3) 주소지정
4) socket 인터페이스
5) 트랜스 포트 엔드 포인트의 생성
본문내용
cket call failed");
exit (1);
}
/* 소켓을 서버의 주소에 연결한다 */
if ( connect(sockfd, (struct sockaddr *) &server, SIZE) == -1)
{
perror ("connect call failed");
exit (1);
}
/* 서버와 정보를 보내고 받는다. */
for (rc ='\n';;)
{
if (rc =='\n')
printf ("Input a lower case character\n");
c = getchar();
send (sockfd, &c, 1, 0);
if (recv(sockfd, &rc, 1, 0)>0)
printf ("%c", rc);
else
{
printf ("server has died\n");
close (sockfd);
exit (1);
}
}
}
1) 무연결 지향 모델의 프로그래밍
- 무연결 모드에서는 클라이언트와 서버 사이에 전송되는 패킷들이 그 목적지에 불확실한 순서로 도착한다
* 메시지를 주고 받기
- 무연결 모델을 위해 추가되는 새로운 시스템 호출들은 sendto와 recvfrom이다.
ssize_t recvfrom (int sockfd, void *message, size_t Length,
int flags , stiuct sockaddr *send_addr,
size_t *add_len);
ssize_t sendto(int sockfd, const void *message, size_t length, int
flags, const stluct sockaddr *dest_addr, size_t
dest ten) ;
recvfrom 호출
- sockfd : 지역적으로 바인드되어 있는 소켓을 지정
- message 포인터 : 수신된 메시지를 넣어둘 버퍼이고, length는 메시지로 읽혀질 바이트 수
- flags : recv 호출에서와 동일한 값
- send_addr 구조 : 메시지를 보낸 기계의 주소 정보
- 마지막인수 : size_t 정수에 대한 포인터로, 호출이 끝나면, 주소의 길이로 채워질 것이다.
sendto 호출
- recvfrom의 반대이다.
- dest_addr 인수는 메시지가 보내어 질 기계의 주소를 보관한 구조체를 지정
- dest_len은 주소길이 지정
1) 무연결 지향 모델의 프로그래밍의 예
/* 서버 */
#include
#include
#include
#include
#define SIZE sizeof (struct sockaddr_in)
main()
{
int sockfd;
char c;
/* 서버의 로컬 포트 *?
struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY};
/* 프로세스의 주소를 넣을 구조 */
struct sockaddr_in client;
int client_len = SIZE;
/* 트랜스포트 엔드 포인트를 구축 */
if ( (sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror ("socket call failed");
exit (1);
}
/* 로컬 주소를 엔드 포인트에 바인드한다 */
if ( bind(sockfd, (struct sockaddr *) &server, SIZE)== -1)
{ perror ("bind call failed");
exit (1);
}
/* 메시지를 기다리며 계속 루프에서 기다린다. */
for( ; ;)
{
/* 메시지를 받고, 클라이언트의 주소를 저장한다. */
if (recvfrom(sockfd, &c, 1, 0,
&client, &client_len)== -1)
{
perror ("server: receiving");
continue;
}
c = toupper(c);
/* 메시지를 원래 출발지로 되돌려 보낸다. */
if ( sendto(sockfd, &c, 1, 0, &client, client_len) == -1)
{
perror ("server: sending");
continue;
}
}
}
그리고 클라이언트:
/* 클라이언트 프로세스 */
#include
#include
#include
#include
#define SIZE sizeof (struct sockaddr_in)
main()
{
int sockfd;
char c;
/* 클라이언트상의 로컬 포트 */
struct sockaddr_in client = {AF_INET, INADDR_ANY, INADDR_ANY};
/* 서버의 원격 주소 */
struct sockaddr_in server = {AF_INET, 7000};
/* 서버의 IP 주소를 변환하여 저장한다. */
server.sin_addr.s_addr = inet_addr("197.45.10.2");
/* 트랜스포트 엔드 포인트를 구축한다. */
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror ("socket call failed");
exit (1);
}
/* 엔드 포인트에 로컬 주소를 바인드한다. */
if ( bind(sockfd, (struct sockaddr *) &client, SIZE) == -1)
{
perror ("bind call failed");
exit (1);
}
/* 키보드로부터 한 문자를 읽는다. */
while ( read(0, &c, 1) != 0)
{
/* 그 문자를 서버에게 보낸다 */
if ( sendto (sockfd, &c, 1, 0, &server, SIZE) == -1)
{
perror ("client: sending");
continue;
}
/* 메시지를 되돌려 받는다 */
if (recv(sockfd, &c, 1, 0)== -1)
{
perror ("client: receiving");
continue;
}
write (1, &c, 1);
}
}
exit (1);
}
/* 소켓을 서버의 주소에 연결한다 */
if ( connect(sockfd, (struct sockaddr *) &server, SIZE) == -1)
{
perror ("connect call failed");
exit (1);
}
/* 서버와 정보를 보내고 받는다. */
for (rc ='\n';;)
{
if (rc =='\n')
printf ("Input a lower case character\n");
c = getchar();
send (sockfd, &c, 1, 0);
if (recv(sockfd, &rc, 1, 0)>0)
printf ("%c", rc);
else
{
printf ("server has died\n");
close (sockfd);
exit (1);
}
}
}
1) 무연결 지향 모델의 프로그래밍
- 무연결 모드에서는 클라이언트와 서버 사이에 전송되는 패킷들이 그 목적지에 불확실한 순서로 도착한다
* 메시지를 주고 받기
- 무연결 모델을 위해 추가되는 새로운 시스템 호출들은 sendto와 recvfrom이다.
ssize_t recvfrom (int sockfd, void *message, size_t Length,
int flags , stiuct sockaddr *send_addr,
size_t *add_len);
ssize_t sendto(int sockfd, const void *message, size_t length, int
flags, const stluct sockaddr *dest_addr, size_t
dest ten) ;
recvfrom 호출
- sockfd : 지역적으로 바인드되어 있는 소켓을 지정
- message 포인터 : 수신된 메시지를 넣어둘 버퍼이고, length는 메시지로 읽혀질 바이트 수
- flags : recv 호출에서와 동일한 값
- send_addr 구조 : 메시지를 보낸 기계의 주소 정보
- 마지막인수 : size_t 정수에 대한 포인터로, 호출이 끝나면, 주소의 길이로 채워질 것이다.
sendto 호출
- recvfrom의 반대이다.
- dest_addr 인수는 메시지가 보내어 질 기계의 주소를 보관한 구조체를 지정
- dest_len은 주소길이 지정
1) 무연결 지향 모델의 프로그래밍의 예
/* 서버 */
#include
#include
#include
#include
#define SIZE sizeof (struct sockaddr_in)
main()
{
int sockfd;
char c;
/* 서버의 로컬 포트 *?
struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY};
/* 프로세스의 주소를 넣을 구조 */
struct sockaddr_in client;
int client_len = SIZE;
/* 트랜스포트 엔드 포인트를 구축 */
if ( (sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror ("socket call failed");
exit (1);
}
/* 로컬 주소를 엔드 포인트에 바인드한다 */
if ( bind(sockfd, (struct sockaddr *) &server, SIZE)== -1)
{ perror ("bind call failed");
exit (1);
}
/* 메시지를 기다리며 계속 루프에서 기다린다. */
for( ; ;)
{
/* 메시지를 받고, 클라이언트의 주소를 저장한다. */
if (recvfrom(sockfd, &c, 1, 0,
&client, &client_len)== -1)
{
perror ("server: receiving");
continue;
}
c = toupper(c);
/* 메시지를 원래 출발지로 되돌려 보낸다. */
if ( sendto(sockfd, &c, 1, 0, &client, client_len) == -1)
{
perror ("server: sending");
continue;
}
}
}
그리고 클라이언트:
/* 클라이언트 프로세스 */
#include
#include
#include
#include
#define SIZE sizeof (struct sockaddr_in)
main()
{
int sockfd;
char c;
/* 클라이언트상의 로컬 포트 */
struct sockaddr_in client = {AF_INET, INADDR_ANY, INADDR_ANY};
/* 서버의 원격 주소 */
struct sockaddr_in server = {AF_INET, 7000};
/* 서버의 IP 주소를 변환하여 저장한다. */
server.sin_addr.s_addr = inet_addr("197.45.10.2");
/* 트랜스포트 엔드 포인트를 구축한다. */
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror ("socket call failed");
exit (1);
}
/* 엔드 포인트에 로컬 주소를 바인드한다. */
if ( bind(sockfd, (struct sockaddr *) &client, SIZE) == -1)
{
perror ("bind call failed");
exit (1);
}
/* 키보드로부터 한 문자를 읽는다. */
while ( read(0, &c, 1) != 0)
{
/* 그 문자를 서버에게 보낸다 */
if ( sendto (sockfd, &c, 1, 0, &server, SIZE) == -1)
{
perror ("client: sending");
continue;
}
/* 메시지를 되돌려 받는다 */
if (recv(sockfd, &c, 1, 0)== -1)
{
perror ("client: receiving");
continue;
}
write (1, &c, 1);
}
}
소개글