프로세스간의 소켓 통신에 대하여...

copy_from_you의 이미지

프로세스간의 통신을 소켓으로 한다는 얘기를 들었는데요.

작은 예제소스 하나만 좀 봤으면 좋겠습니다.

답변은 안달고 그저.. 여기다 질문만 올리니 참 저도 심정이 갑갑합니다.

고수여러분의 고견 부탁드립니다.

vinus의 이미지

엉뚱한 답변을 올리니 양해 바랍니다.

프로세스간의 통신은 소켓으로만 가능 한 것이 아닙니다.

공유 메모리, 메시지큐, 파이프등, 여러가지를 사용 할 수 있습니다.

먼저 IPC리소스를 잘 알아 보신다음, 적당한 것을 사용 하셔야 할 듯 합니다.

>>>행복한 웃음<<<

realbright의 이미지

#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번이나 수정하게되네요.. ^^;

가끔은 밥을 굶어도 살 수 있다.

cococo의 이미지

저는 헤더 파일 찾아봤거든요. -_-;;
혹시나 참고가 될 지 몰라 올립니다.(인터넷 뒤진거라 필요없는 게 있을수도 있습니다.)
컴파일은 잘 되던데요.

<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>

kkb110의 이미지

여담이지만. .NET framework 에서는 프로세스간 통신을 하려면 무조건 소켓을 써야됩니다 -0-;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.