CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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;

}
}
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.