TCPIP

2013.07.08_Inter Process Communication(IPC)_활용.

성엽이 2013. 7. 9. 14:36

 

 Intercom_server

 /****** IPC(Inter Process Communication) 소켓 내부적으로 통신하는 방법 : FILE_SOCKET *****/

#include<stdio.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>

#define  FILE_SOCKET "../SMART.SOCKET"

int main()
{
  
int iRSock;
  
int  iCSock;
  
int  iStructSize;
  
struct sockaddr_un stSAddr;
  
struct sockaddr_un stCAddr;  

  
// 파일 지우기 명령.
  
// 파일들의 조각들을 끊어주는 명령그래서 지워짐.
  
// 기존의 파일이 있으면 초기화 해주는느낌.
  unlink(FILE_SOCKET);

  iRSock 
= socket(AF_UNIX, SOCK_STREAM, 0);
  stSAddr.sun_family 
= AF_UNIX;
  strcpy(stSAddr.sun_path, FILE_SOCKET);
  iStructSize 
= sizeof(struct sockaddr_un);
  bind(iRSock, (
struct sockaddr *)&stSAddr, iStructSize);
  
  listen(iRSock, 
5);

  
while(1)
  {  
// while 문안에 첫번째줄 변수선언.
    
unsigned char ucData[255];
    
unsigned int uiRet;
    printf(
"접속 대기중 ... \n");
    iCSock 
= accept(iRSock, (struct sockaddr*)&stCAddr, &iStructSize);
    uiRet  
= read(iCSock, ucData, sizeof(ucData));
    ucData[uiRet-
1]=0// ENTER 제거.
    printf(
"접속 MSG : [%s]\n", ucData);
    close(iCSock);
    
if('$' == ucData[0])
    {
      
break;
    }
  }
  
  close(iRSock);

  
// 기존의 소켓을 지운다.
  unlink(FILE_SOCKET);
  
  
return 0;
}

 

 

 Intercom_Clnt

#include<stdio.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>

#define  FILE_SOCKET "../SMART.SOCKET"

int main()
{
  
int  iCSock;
  
int  iStructSize;
  
struct sockaddr_un stSAddr;
  
unsigned char ucData[255];
  
int iRet;

  iCSock 
= socket(AF_UNIX, SOCK_STREAM, 0);
  stSAddr.sun_family 
= AF_UNIX;
  strcpy(stSAddr.sun_path, FILE_SOCKET);
  iStructSize 
= sizeof(struct sockaddr_un);

  
while(1)
  {
    iRet 
= connect(iCSock, (struct sockaddr *)&stSAddr, iStructSize);

    
if(0 > iRet)
    {
      perror(
"connect : ");
      
return 0;
    }

    printf(
"접속 성공 : 메세지를 입력하세요.\n");
    iRet 
= read(0, ucData, sizeof(ucData));
    write(iCSock, ucData, iRet);
    printf(
"전송을 완료했습니다종료합니다.\n");
    close(iCSock);
    
if('$' == ucData[0])
    {
      
break;
    }
    iCSock 
= socket(AF_UNIX, SOCK_STREAM, 0);
  }
  
return 0;

} 

 

 

 

 Inter Process Communication(IPC)

 내부적인 통신을 하는 방법중에 FILE_SOCKET 을 이용하면 가능하다. #define FILE_SOCKET을 이용해서 상위폴더에 SMART.SOCKET 이라는 

 SOCKET 확장자.SOCKET ) 를 만들어서 직접 내부적인 통신을 하는 방법이다.

 

 

 

 cp lan/20130708(존재하는폴더경로)/(파일이름) ../ -> home 디렉토리에 실행파일을 복사한다.

 cp (파일이름) ~/ -> home 디렉토리 파일 옮기기.

 

 

 makefile

TRG = make

SRC = $(TRG).c
CFLAG 
= -lpthread
CC 
= gcc

all : $(SRC)
     @$(CC) -o $(TRG) $(SRC) $(CFLAG)
     @ls -l $(TRG)

clean :
     @rm -rf $(TRG)

rebuild : clean all

 

: make  

: make clean 

: make TRG=컴파일할파일이름 (타겟을 다시 지정)



만들어진곳. home 디렉토리.


실행후 ㅎㅎ





#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family


struct sockaddr_un

{

__SOCKADDR_COMMON (sun_);

char sun_path[108];     /* Path name.  */

};


sa_prefix <= sun


sa_family_t sa_prefix##family <= sa_prefix## 이게 sun_ 로 바뀌면서 ## 때문에 family 가 붙게된다.


sa_family_t sun_family


typedef unsigned short int sa_family_t;



// 구조체 크기가 110byte 겠다.

struct sockaddr_un

{

sa_family_t sun_family;

char sun_path[108];     /* Path name.  */

};