...
UDP의 데이터 손실문제와.. 현재 발생되는 문제는 아무런 관계가 없다고
생각되네요..
...
그래서 참고입니다.
facered79 wrote:
...
프로세스간 통신을 위한 LOCAL 프로토콜을 사용할때
INET 을 프로세스간 통신에 사용하는 것보다
더 좋은 성능을 얻을 수 있는것인가요?
...
로컬에 존재하는 프로세스간에, INET TCP 과 Unix Domain socket의 경우 약 1.5배정도 Unix Domain socket이 유리하다는 말씀을 드립니다.
이 또한 UDP와는 관련없어서... ㅎㅎ
근본적인 원인은 IP레이어 까지 내려가느냐? 아니면 Layer 4수준까지 내려가느냐?의 차이입니다. 7Layer에 입각해서 보면 대충 나오지요. 그리고, 각종 성능관련 문서에서 쉽게 찾아보실 수 있겠습니다.
제대로 오픈하고, 사용하신다면 안될 이유가 없습니다.* 참고,
제대로 오픈하고, 사용하신다면 안될 이유가 없습니다.
* 참고,
그러나, UDP 패킷은 손실가능하다는것은 아실테고, 그중 네트워크단에서 잃어버리기 보다는 시스템내에서 잃어버리는 양이 많다는것을 참고하시기 바랍니다.
음... INET으로 할때는..
INET 으로 할때는 문제 없이 잘 되는 소스를
LOCAL로 바꿨을때 생기는 문제니까..
LOCAL을 쓰기 이전의 소스에는 문제가 있다고 볼 수 없을듯 하고..
UDP의 데이터 손실문제와.. 현재 발생되는 문제는 아무런 관계가 없다고
생각되네요..
프로세스간 통신을 위한 LOCAL 프로토콜을 사용할때
INET 을 프로세스간 통신에 사용하는 것보다
더 좋은 성능을 얻을 수 있는것인가요?
PF_LOCAL == PF_UNIX == AF_UNIXUnix D
PF_LOCAL == PF_UNIX == AF_UNIX
Unix Domain socket 의 경우에는, sockaddr 스트럭쳐를
sockaddr_in 대신 sockaddr_un 을 써야 합니다.
참고로, sockaddr_un 은 sockaddr_in 과는 내용이 틀립니다
Re: 음... INET으로 할때는..
그래서 참고입니다.
로컬에 존재하는 프로세스간에, INET TCP 과 Unix Domain socket의 경우 약 1.5배정도 Unix Domain socket이 유리하다는 말씀을 드립니다.
이 또한 UDP와는 관련없어서... ㅎㅎ
근본적인 원인은 IP레이어 까지 내려가느냐? 아니면 Layer 4수준까지 내려가느냐?의 차이입니다. 7Layer에 입각해서 보면 대충 나오지요. 그리고, 각종 성능관련 문서에서 쉽게 찾아보실 수 있겠습니다.
sockaddr_un 을 사용하는데요..
클라이언트에서 서버로 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); }댓글 달기