다음은 조인c에 올라와 있는 Unix Domain Socket - UDP 의 소스
글쓴이: facered79 / 작성시간: 화, 2005/08/09 - 11:41오전
아래 소스에서
서버측의 send 부분실행시 -1 을 리턴 합니다..
클라이언트로 보낼 수 없다는 얘기인데요..
왜 안되는지 이유를 알수가 없습니다..
domain 을 이용한 udp 서버/클라이언트 소스를 구할 수 있을까요..
예제 : sum_server.c #include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
struct data
{
int a;
int b;
int sum;
};
int main(int argc, char **argv)
{
int sockfd;
int clilen;
struct data mydata;
struct sockaddr_un clientaddr, serveraddr;
sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("socket error : ");
exit(0);
}
unlink(argv[1]);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, argv[1]);
if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind error : ");
exit(0);
}
clilen = sizeof(clientaddr);
while(1)
{
recvfrom(sockfd, (void *)&mydata, sizeof(mydata), 0, (struct sockaddr *)&clientaddr, &clilen);
printf("%d + %d = %d\n", mydata.a, mydata.b, mydata.a + mydata.b);
sendto(sockfd, (void *)&mydata, sizeof(mydata), 0, (struct sockaddr *)&clientaddr, clilen);
}
close(sockfd);
exit(0);
}
예제 : sum_client.c #include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
struct data
{
int a;
int b;
int sum;
};
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_un serveraddr;
int clilen;
struct data mydata;
sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("exit : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, argv[1]);
clilen = sizeof(serveraddr);
mydata.a = atoi(argv[2]);
mydata.b = atoi(argv[3]);
mydata.sum =0;
if (sendto(sockfd, (void *)&mydata, sizeof(mydata), 0,
(struct sockaddr *)&serveraddr, clilen) < 0)
{
perror("send error : ");
exit(0);
}
if (recvfrom(sockfd, (void *)&mydata, sizeof(mydata), 0,
(struct sockaddr *)&serveraddr, clilen) < 0)
{
perror("recv error : ");
exit(0);
}
printf("result is : %d\n", mydata.sum);
close(sockfd);
exit(0);
}
Forums:


bind 하고 있는 소켓이 있어야 할 것 같네요.
bind 하고 있는 소켓이 있어야 할 것 같네요.
------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.
대충 돌게 만들자면 아래와 같겠습니다.server.c[code
대충 돌게 만들자면 아래와 같겠습니다.
server.c
#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, len; int state; int n; int sum; struct data add_data; struct sockaddr_un serveraddr, clientaddr; signal(SIGCHLD,SIG_IGN); clilen = sizeof(clientaddr); sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket error : "); exit(0); } unlink("sum_server1"); memset(&serveraddr,0,sizeof(serveraddr)); serveraddr.sun_family = AF_LOCAL; strcpy(serveraddr.sun_path,"sum_server1"); state = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if (state == -1) { perror("bind error : "); exit(0); } len = sizeof(clientaddr); while(1) { clilen = len; n = recvfrom(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct socka ddr *)&clientaddr, &clilen); add_data.sum = add_data.a + add_data.b; n=sendto(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct sockaddr *)&clientaddr, clilen); } close(sockfd); }client.c
#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; sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket error : "); exit(0); } bzero(&cli_addr,sizeof(cli_addr)); cli_addr.sun_family=AF_LOCAL; unlink("xxx"); strcpy(cli_addr.sun_path,"xxx"); state = bind(sockfd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)); if (state == -1) { perror("bind error : "); exit(0); } serveraddr.sun_family = AF_LOCAL; strcpy(serveraddr.sun_path, "sum_server1"); add_data.a = atoi(argv[1]); add_data.b = atoi(argv[2]); servlen = sizeof(serveraddr); if(sendto(sockfd, (void *)&add_data, sizeof(add_data), 0, (struct sockaddr *) &serveraddr, servlen)==-1) printf("error cant send\n"); printf("ready recv\n"); if(recvfrom(sockfd, (void *)&add_data, sizeof(add_data),0, (struct sockaddr * )&serveraddr, &servlen)==-1) printf("error cant recv\n"); printf("--> %d + %d = %d\n", add_data.a, add_data.b, add_data.sum); close(sockfd); }댓글 달기