| [ CnUnix ] in KIDS 글 쓴 이(By): russell (huhu) 날 짜 (Date): 2003년 5월 29일 목요일 오후 08시 02분 59초 제 목(Title): [Q] unix socket 쌓일 수 있는 datagram수 unix domain socket(datagram)을 사용하는 프로그램을 작성하였는데, receiver의 buffer에 쌓일 수 있는 datagram수가 너무 작은 것 같더군요. sender가 한 10개 정도 밖에 못 보내고, 더 보내려고 하면 error를 리턴합니다 (MSG_DONTWAIT 옵션을 주었을 경우). 메세지 size(10B)를 생각할 때 buffer size(64KB)는 충분한 것 같습니다. 아래 프로그램에 무슨 문제가 있나요? 사용 OS는 redhat 8.0 kernel 2.4.18-14debug 입니다. ----> dg_serv.c #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <errno.h> #define MAXLINE 1024 int main(int argc, char **argv) { int sockfd, clilen, rcvbufsize, len; struct sockaddr_un cliaddr, servaddr; char recvline[MAXLINE + 1]; char UNIXDG_PATH[30]="unix_sock_dgram"; sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); unlink(UNIXDG_PATH); bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_LOCAL; strcpy(servaddr.sun_path, UNIXDG_PATH); bind(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr)); len = sizeof(rcvbufsize); getsockopt( sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbufsize, &len); printf("recv buffer size = %d\n", rcvbufsize); clilen = sizeof(cliaddr); while (1) { int n; getchar(); while( (n = recvfrom(sockfd, recvline, MAXLINE, MSG_DONTWAIT, (struct sockaddr*) &cliaddr, &clilen ))>0 ) { recvline[n]='\0'; printf("Received :%s", recvline); } } } ----> dg_cli.c #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <errno.h> #define MAXLINE 1024 int main(int argc, char **argv) { int sockfd, count=0; struct sockaddr_un cliaddr, servaddr; char UNIXDG_PATH[30]="unix_sock_dgram"; sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); bzero(&cliaddr, sizeof(cliaddr)); /* bind an address for us */ cliaddr.sun_family = AF_LOCAL; strcpy(cliaddr.sun_path, tmpnam(NULL)); bind(sockfd, (struct sockaddr*) &cliaddr, sizeof(cliaddr)); bzero(&servaddr, sizeof(servaddr)); /* fill in server's address */ servaddr.sun_family = AF_LOCAL; strcpy(servaddr.sun_path, UNIXDG_PATH); while (1) { char sendline[MAXLINE]; int retval; sprintf( sendline, "Message %d\n" , count); retval = sendto(sockfd, sendline, strlen(sendline), MSG_DONTWAIT, (struct sockaddr*) &servaddr, sizeof(servaddr) ); printf("called sendto() with %s", sendline); printf("return value = %d, errno = %d\n",retval,errno); sleep(1); count += 1; } } |