Unix Domain Socket 서버 생성시 고려사항...
글쓴이: angra / 작성시간: 월, 2008/10/27 - 5:46오후
UDS는 기본적으로 IPC를 기반으로 하기 때문에, 소켓 옵션 적용에
별로 신경을 안쓰고 사용했는데, 이번에 Sun 10에서 개발하면서 접속
클라이언트수가 늘어나면서 문제가 되었습니다.
결국 원인을 찾다보니 Non blocking 모드를 명시적으로 해줘야되더군요.
int srv_domain (char *sockname) { char udp_path[PATH_MAX]; struct sockaddr_un serveraddr; int sockfd; sprintf(udp_path, "%s/S%c/%s_sock", getenv("_S_FIFO"),_SubSystem_Name[1]-32, sockname); if (unlink(udp_path) < 0) { Log (USR_OK, "unlink Error[%s:%s]", udp_path,strerror(errno)); } if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { Log (UDP_FATAL, "socket Error[%s]", strerror(errno)); return -1; } /* setting non-blocking mode for UDS */ int flags; if ((flags = fcntl(sockfd, F_GETFL, 0)) < 0 || fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) { Log (UDP_FATAL, "setting O_NONBLOCK[%s]", strerror(errno)); return -1; } memset(&serveraddr, 0x00, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; strcpy(serveraddr.sun_path, udp_path); if (bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0) { Log (UDP_FATAL, "bind Error[%s]", strerror(errno)); return -1; } if (listen(sockfd, MAX_UDS_SOCK) < 0 ) { Log (UDP_FATAL, "listen Error[%s]", strerror(errno)); return -1; } else Log (USR_OK, "DOMAIN SOCKET Ready [%s]", udp_path); return sockfd; }
Forums:
댓글 달기