프로세스간의 통신을 소켓으로 한다는 얘기를 들었는데요.
작은 예제소스 하나만 좀 봤으면 좋겠습니다.
답변은 안달고 그저.. 여기다 질문만 올리니 참 저도 심정이 갑갑합니다.
고수여러분의 고견 부탁드립니다.
엉뚱한 답변을 올리니 양해 바랍니다.
프로세스간의 통신은 소켓으로만 가능 한 것이 아닙니다.
공유 메모리, 메시지큐, 파이프등, 여러가지를 사용 할 수 있습니다.
먼저 IPC리소스를 잘 알아 보신다음, 적당한 것을 사용 하셔야 할 듯 합니다.
>>>행복한 웃음<<<
#include 각설- int main(int argc,char **argv) { sturct sockaddr ser_addr,cli_addr; int sock,sock_cli; sock=socket(AF_INET,SOCK_STRAM,0); //socket fd설정 실제 sock의 값은 3 bzero((char *)&ser_addr,sizeof(ser_addr); //ser_addr 0으로 초기화 ser_addr.sin_family=AF_INET; ser_addr.sin_addr.s_addr=htonl(INADDR_ADY); ser_addr.sin_prot=htons(atoi(argv[1])); //struct인 ser_addr에 입력값 삽입 bind(sock,(struct sockaddr *)&ser_addr,sizeof(ser_addr); //소켓 번호와 스트럭처 값들을 묶어줌(서버에서만 필요) listen(sock,5); //client가 접속할때까지 수동대기 상태.. sock_cli=accept(sock,(sturct sockaddr *)&cli_addr,sizeof(cli_addr); //client의 접속을 accept 여기까지 가 연결부고.. 이외에... stream(TCP)일 경우 read or write동작을 통해 간단하게 메시지를 주고 받을수 있는 소켓통신을 할수 있구요.. 위의 socket을 만들때 ..DGRAM의로 설정시는 UDP를 이용한 소켓 통신도 가능합니다.. ex는 echo프로그램이 있을텐데.. 그쪽을 보시는게..이해가 빠르실듯.. 아..위는 리눅스 기준으로 된 프로그래밍임.. 저도 시작한지 얼마 안되서...문법이 확실한지는 모르겠네요..생각난데로 친거라..^^;
같은 장비에서 프로세스간 소켓통신을 할때는 윗분처럼 그냥 INET을 이용할 수도 있겠지만,
같은 장비에서 소켓통신을 한다면 파일이름공간소켓(맞나?)을 사용하는편이
더 좋을 듯 합니다. 속도면에서도 많이 빠르다 하더군요.
나중에 소켓 생성부분만 INET으로 수정하면 다른장비와 통신도 바로 되고..
server
int main ( void ) { int size, server_fd, client_fd; struct sockaddr_un server_name, client_name; memset ( &server_name, 0x00, sizeof ( server_name ) ); memset ( &client_name, 0x00, sizeof ( client_name ) ); if ( ( server_fd = socket ( PF_UNIX, SOCK_STREAM, 0 ) ) < 0 ) { perror ("file named socket create fail "); return -1; } server_name.sun_family = PF_FILE; strcpy ( server_name.sun_path, "sock_file" ); size = ( offsetof ( struct sockaddr_un, sun_path ) + strlen ( server_name.sun_path ) + 1 ); if ( bind ( server_fd, (struct sockaddr *) &server_name, size ) < 0 ) { perror ("ffine named socket bind fail "); return -2; } listen ( server_fd, 1 ); client_fd = accept ( server_fd, (struct sockaddr *) &client_name, &size ); /* send or recv */ close ( client_fd ); close ( server_fd ); return 0; }
client
int main ( void ) { int sock_fd, size; struct sockaddr_un server_name; memset ( &server_name, 0x00, sizeof ( server_name ) ); if ( ( sock_fd = socket ( PF_UNIX, SOCK_STREAM, 0 ) ) <= 0 ) { perror ("file named socket create fail "); return -1; } server_name.sun_family = PF_FILE; strcpy ( server_name.sun_path, "sock_file"); size = ( offsetof ( struct sockaddr_un, sun_path ) + strlen ( server_name.sun_path ) + 1 ); if ( connect ( sock_fd, (struct sockaddr *) &server_name, size ) < 0 ) { perror ("file named socket connect fail "); close ( sock_fd ); return -2; } /* recv or send */ close ( sock_fd ); return 0; }
테스트해보지는 않았습니다.. 컴파일할때 에러가 날수도... ^^;
주의해야할 점은, 소켓을 모두 close했다 하더라도 생성된 파일은 남아있게됩니다.
그러므로, 파일을 처음 바인드할때라던가 모든 소켓이 close되었을때 파일을 삭제해 줘야합니다.
ps : 휴... 그냥 입력을 하려니 4번이나 수정하게되네요.. ^^;
가끔은 밥을 굶어도 살 수 있다.
저는 헤더 파일 찾아봤거든요. -_-;; 혹시나 참고가 될 지 몰라 올립니다.(인터넷 뒤진거라 필요없는 게 있을수도 있습니다.) 컴파일은 잘 되던데요.
<stdio.h> <stddef.h> <sys/socket.h> <sys/time.h> <sys/types.h> <sys/socket.h> <sys/fcntl.h> <netinet/in.h> <sys/uio.h> <sys/un.h> <unistd.h> <error.h>
여담이지만. .NET framework 에서는 프로세스간 통신을 하려면 무조건 소켓을 써야됩니다 -0-;;
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
엉뚱한 답변을 올리니 양해 바랍니다.프로세스간의 통신은 소켓으로만
엉뚱한 답변을 올리니 양해 바랍니다.
프로세스간의 통신은 소켓으로만 가능 한 것이 아닙니다.
공유 메모리, 메시지큐, 파이프등, 여러가지를 사용 할 수 있습니다.
먼저 IPC리소스를 잘 알아 보신다음, 적당한 것을 사용 하셔야 할 듯 합니다.
>>>행복한 웃음<<<
#include 각설-int main(int argc,char **a
#include 각설-
int main(int argc,char **argv)
{
sturct sockaddr ser_addr,cli_addr;
int sock,sock_cli;
sock=socket(AF_INET,SOCK_STRAM,0);
//socket fd설정 실제 sock의 값은 3
bzero((char *)&ser_addr,sizeof(ser_addr);
//ser_addr 0으로 초기화
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ADY);
ser_addr.sin_prot=htons(atoi(argv[1]));
//struct인 ser_addr에 입력값 삽입
bind(sock,(struct sockaddr *)&ser_addr,sizeof(ser_addr);
//소켓 번호와 스트럭처 값들을 묶어줌(서버에서만 필요)
listen(sock,5);
//client가 접속할때까지 수동대기 상태..
sock_cli=accept(sock,(sturct sockaddr *)&cli_addr,sizeof(cli_addr);
//client의 접속을 accept
여기까지 가 연결부고..
이외에...
stream(TCP)일 경우 read or write동작을 통해
간단하게 메시지를 주고 받을수 있는 소켓통신을 할수 있구요..
위의 socket을 만들때 ..DGRAM의로 설정시는
UDP를 이용한 소켓 통신도 가능합니다..
ex는 echo프로그램이 있을텐데..
그쪽을 보시는게..이해가 빠르실듯..
아..위는 리눅스 기준으로 된 프로그래밍임..
저도 시작한지 얼마 안되서...문법이 확실한지는 모르겠네요..생각난데로 친거라..^^;
같은 장비에서 프로세스간 소켓통신을 할때는 윗분처럼 그냥 INET을 이용
같은 장비에서 프로세스간 소켓통신을 할때는 윗분처럼 그냥 INET을 이용할 수도 있겠지만,
같은 장비에서 소켓통신을 한다면 파일이름공간소켓(맞나?)을 사용하는편이
더 좋을 듯 합니다. 속도면에서도 많이 빠르다 하더군요.
나중에 소켓 생성부분만 INET으로 수정하면 다른장비와 통신도 바로 되고..
server
client
테스트해보지는 않았습니다.. 컴파일할때 에러가 날수도... ^^;
주의해야할 점은, 소켓을 모두 close했다 하더라도 생성된 파일은 남아있게됩니다.
그러므로, 파일을 처음 바인드할때라던가 모든 소켓이 close되었을때 파일을 삭제해 줘야합니다.
ps : 휴... 그냥 입력을 하려니 4번이나 수정하게되네요.. ^^;
가끔은 밥을 굶어도 살 수 있다.
혹시나 해서 헤더 파일 올립니다.
저는 헤더 파일 찾아봤거든요. -_-;;
혹시나 참고가 될 지 몰라 올립니다.(인터넷 뒤진거라 필요없는 게 있을수도 있습니다.)
컴파일은 잘 되던데요.
<stdio.h>
<stddef.h>
<sys/socket.h>
<sys/time.h>
<sys/types.h>
<sys/socket.h>
<sys/fcntl.h>
<netinet/in.h>
<sys/uio.h>
<sys/un.h>
<unistd.h>
<error.h>
여담이지만. .NET framework 에서는 프로세스간 통신을 하려면
여담이지만. .NET framework 에서는 프로세스간 통신을 하려면 무조건 소켓을 써야됩니다 -0-;;
댓글 달기