linux 환경에서 udp 소켓통신을 하는데요..

facered79의 이미지

pf 와 af 를 서버와 클라이언트 둘다

pf는 PF_LOCAL
af는 AF_LOCAL

로 사용했습니다.

INET 로 할때는 잘 되던 통신이

LOCAL로 바뀌니까 SEND에서 -1을 리턴 합니다..

원래 안되는 것인가요??

익명 사용자의 이미지

제대로 오픈하고, 사용하신다면 안될 이유가 없습니다.

* 참고,
그러나, UDP 패킷은 손실가능하다는것은 아실테고, 그중 네트워크단에서 잃어버리기 보다는 시스템내에서 잃어버리는 양이 많다는것을 참고하시기 바랍니다.

facered79의 이미지

INET 으로 할때는 문제 없이 잘 되는 소스를
LOCAL로 바꿨을때 생기는 문제니까..
LOCAL을 쓰기 이전의 소스에는 문제가 있다고 볼 수 없을듯 하고..

UDP의 데이터 손실문제와.. 현재 발생되는 문제는 아무런 관계가 없다고
생각되네요..

프로세스간 통신을 위한 LOCAL 프로토콜을 사용할때

INET 을 프로세스간 통신에 사용하는 것보다

더 좋은 성능을 얻을 수 있는것인가요?

kslee80의 이미지

PF_LOCAL == PF_UNIX == AF_UNIX

Unix Domain socket 의 경우에는, sockaddr 스트럭쳐를
sockaddr_in 대신 sockaddr_un 을 써야 합니다.

참고로, sockaddr_un 은 sockaddr_in 과는 내용이 틀립니다

익명 사용자의 이미지

facered79 wrote:

...
UDP의 데이터 손실문제와.. 현재 발생되는 문제는 아무런 관계가 없다고
생각되네요..
...

그래서 참고입니다.
facered79 wrote:

...
프로세스간 통신을 위한 LOCAL 프로토콜을 사용할때

INET 을 프로세스간 통신에 사용하는 것보다

더 좋은 성능을 얻을 수 있는것인가요?
...


로컬에 존재하는 프로세스간에, INET TCP 과 Unix Domain socket의 경우 약 1.5배정도 Unix Domain socket이 유리하다는 말씀을 드립니다.
이 또한 UDP와는 관련없어서... ㅎㅎ
근본적인 원인은 IP레이어 까지 내려가느냐? 아니면 Layer 4수준까지 내려가느냐?의 차이입니다. 7Layer에 입각해서 보면 대충 나오지요. 그리고, 각종 성능관련 문서에서 쉽게 찾아보실 수 있겠습니다.
익명 사용자의 이미지

클라이언트에서 서버로 send는 현재 되는데

서버에서 클라이언트로 보내는 과정에서 안됩니다..

아래 현재 소스를 올리겠습니다..

소스가 길지만 .. 거의 템플릿 수준이니까.. 잠시만 봐주시면

감사하겠어요..

그럼.

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>

struct data
{
    int a;
    int b;
    int sum;
    int test[5];
};

int main(int argc, char **argv)
{
    int sockfd;
    int clilen;
    int state;
    int n;
    int sum;
    struct data add_data;

    struct sockaddr_un serveraddr, clientaddr;

    signal(SIGCHLD,SIG_IGN);
    clilen = sizeof(clientaddr);
    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    memset(&serveraddr,0,sizeof(serveraddr));
//    bzero(&serveraddr, sizeof(serveraddr));
    //serveraddr.sin_family = AF_LOCAL;
    serveraddr.sun_family = AF_LOCAL;
    //strcpy(serveraddr.sun_path,"/home/facered/EXAM7/sum_server");
    strcpy(serveraddr.sun_path,"sum_server1");
//    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
//    serveraddr.sin_port = htons(1234);
    unlink("sum_server1");
    state = bind(sockfd, (struct sockaddr *)&serveraddr,
        sizeof(serveraddr));
    if (state == -1)
    {
        perror("bind error : ");
        exit(0);
    }
    while(1)
    {
        n = recvfrom(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct sockaddr *)&clientaddr, &clilen);
        printf("n is %d\n",n);
        add_data.sum = add_data.a + add_data.b;
        n=sendto(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct sockaddr *)&clientaddr, clilen);
        printf("n is %d\n",n);
    }
    close(sockfd);
}

클라이언트

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/un.h>

struct data
{
    int a;
    int b;
    int sum;
    int test[5];
};
int main(int argc, char **argv)
{
    int sockfd;
    int clilen;
    int servlen;
    int state;
    char buf[255];

    struct sockaddr_un serveraddr,cli_addr;
    struct data add_data;


    memset(buf, 0x00, 255);

    add_data.test[0]=2;

    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sun_family = AF_LOCAL;
    strcpy(serveraddr.sun_path,"sun_server1");

    servlen = sizeof(serveraddr);

    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    
    bzero(&cli_addr,sizeof(cli_addr));
    cli_addr.sun_family=AF_LOCAL;
    strcpy(cli_addr.sun_path,"sum");
    mkstemp(cli_addr.sun_path);
    clilen = strlen(cli_addr.sun_path) + sizeof(cli_addr.sun_family);

    serveraddr.sun_family = AF_LOCAL;
    strcpy(serveraddr.sun_path, "sum_server1");

    add_data.a = atoi(argv[1]);
    add_data.b = atoi(argv[2]);

    if(sendto(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct sockaddr *)&serveraddr, servlen)==-1)
        printf("error cant send\n");

    if(recvfrom(sockfd, (void *)&add_data, sizeof(add_data), 0, NULL, NULL)==-1)
        printf("error cant recv\n");


    printf("--> %d + %d = %d\n", add_data.a, add_data.b, add_data.sum);
    close(sockfd);
}

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.