|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Unix Domain Socket(ÀÌÇÏ UDS) ´Â socket API¸¦ ¼öÁ¤¾øÀÌ ÀÌ¿ë¸ç,
port ±â¹ÝÀÇ Inernet Domain Socket¿¡ ºñÇØ¼ ·ÎÄà ½Ã½ºÅÛÀÇ ÆÄÀϽýºÅÛÀ»
ÀÌ¿ëÇØ¼ ³»ºÎÇÁ·Î¼¼½º°£ÀÇ Åë½ÅÀ» À§ÇØ »ç¿ëÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù°í ÇÒ¼ö ÀÖ´Ù.
ls ¸¦ ÀÌ¿ëÇØ¼ Åë½ÅÀ» À§Çؼ ¸¸µé¾îÁø ÆÄÀÏÀ» º¸¸é ´ÙÀ½°ú °°Àº ¸ð½ÀÀ»
º¸ÀδÙ.
[yundream@localhost tmp]$ ls -al
srwx------ 1 root nobody 0 12¿ù 14 21:16 .fam_socket
|
º¸¸é ÆÄÀÏŸÀÔ¿¡ "s" °¡ ºÙ¾î ÀÖ´Â°É ¾Ë¼ö ÀÖÀ¸¸ç, ÆÄÀÏ»çÀÌÁî°¡ 0À¸·Î µÇ¾î ÀÖ´Â
°É ¾Ë¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé FIFO¿Í ¸¶Âù°¡Áö·Î ¸Þ½ÃÁö°¡ ÆÄÀÏ·Î ½×ÀÌÁö ¾Ê°í
Ä¿³Î·Î Àü´ÞµÇ¾î¼ Ä¿³Î¿¡¼ ó¸®Çϱ⠶§¹®ÀÌ´Ù.
ÆÄÀÏÀ» ÅëÇØ¼ Åë½ÅÀ» Çϸç, Ä¿³Î³»ºÎ¿¡¼ ¸Þ½ÃÁö¸¦ °ü¸®ÇÑ´Ù´Â Á¡¿¡¼
FIFO¿Í ¸Å¿ì À¯»çÇѸéÀ» º¸¿©ÁÖÁö¸¸, FIFO¿Í´Â ´Þ¸® ¾ç¹æÇâ Åë½ÅÀÌ °¡´ÉÇÏ´Ù´Â
Ư¡À» °¡Áö°í ÀÖ´Ù. ±×·¯¹Ç·Î ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀÌ´Â ¼¹ö/Ŭ¶óÀ̾ðÆ®
¸ðµ¨À» ¸¸µé±â°¡ ¸Å¿ì ½±´Ù.
¶ÇÇÑ Inet ¼ÒÄÏÀ» ÅëÇÑ ¿ÜºÎÅë½Å¿¡ ºñÇØ¼ 2¹è ÀÌ»óÀÇ È¿À²À» º¸¿©ÁØ´Ù¶ó´Â
ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.
¸¹Àº °æ¿ì ¾à°£ º¹ÀâÇÑ ³»ºÎÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇØ¾ßµÈ´Ù°í ÇßÀ»¶§ UDSÀ» ¸¹ÀÌ
»ç¿ëÇÑ´Ù. INET °èÃþ¿¡¼ÀÇ Åë½ÅÀÌ TCP/IP 4°èÃþÀ» ¸ðµÎ °ÅÄ¡´Â°Í°ú´Â
´Ù¸£°Ô, UDS Àº ¾îÇø®ÄÉÀÌ¼Ç °èÃþ¿¡¼ TCP °èÃþ±îÁö¸¸ ¸Þ½ÃÁö°¡ Àü´ÞµÇ°í,
´Ù½Ã °ð¹Ù·Î ¾îÇø®ÄÉÀÌ¼Ç °èÃþÀ¸·Î ¸Þ½ÃÁö°¡ ¿Ã¶ó°¡°Ô µÈ´Ù. TCP/IP °èÃþ¿¡ ´ëÇÑ
ÀÚ¼¼ÇÑ ³»¿ëÀº TCP/IP °³¿ä(2)¸¦ Âü°í Çϱ⠹ٶõ´Ù.
À§¿¡¼ INET ¼ÒÄϺ¸´Ù 2¹èÀÌ»óÀÇ È¿À²À» °¡Áø´Ù°í Çߴµ¥,
4°èÃþÀÇ ·¹À̾ ¸ðµÎ °ÅÃľßÇÏ´Â INET ¼ÒÄÏ¿¡ ºñÇØ¼ ´ÜÁö 2°³ÀÇ ·¹À̾
»ç¿ëÇÑ´Ù´Â Á¡µµ ±× ÀÌÀ¯Áß Çϳª·Î ÀÛ¿ëÇÑ´Ù.
½î¾² ÄÚµå´Â ´ÙÁß¿¬°á¼¹ö ¸¸µé±â(1)ÀÇ zipcode_multi.c ¿Í
¼ÀÇ÷Π¾Ë¾Æº¸´Â ¼ÒÄÏÇÁ·Î±×·¡¹Ö(1)ÀÇ zipcode_cli.c ¸¦ »ç¿ëÇϵµ·ÏÇÒ°ÍÀÌ´Ù.
¿¹Á¦: zipcode_local.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>
int main(int argc, char **argv)
{
int server_sockfd, client_sockfd;
int state, client_len;
pid_t pid;
FILE *fp;
struct sockaddr_un clientaddr, serveraddr;
char buf[255];
char line[255];
if (argc != 2)
{
printf("Usage : ./zipcode [file_name]\n");
printf("¿¹ : ./zipcode /tmp/mysocket\n");
exit(0);
}
memset(line, '0', 255);
state = 0;
if (access(argv[1], F_OK) == 0)
{
unlink(argv[1]);
}
// ÁÖ¼Ò ÆÄÀÏÀ» ÀоîµéÀδÙ.
client_len = sizeof(clientaddr);
if((fp = fopen("zipcode.txt", "r")) == NULL)
{
perror("file open error : ");
exit(0);
}
// internet ±â¹ÝÀÇ ½ºÆ®¸² ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù.
if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
perror("socket error : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, argv[1]);
state = bind(server_sockfd , (struct sockaddr *)&serveraddr,
sizeof(serveraddr));
if (state == -1)
{
perror("bind error : ");
exit(0);
}
state = listen(server_sockfd, 5);
if (state == -1)
{
perror("listen error : ");
exit(0);
}
printf("accept : \n");
while(1)
{
client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
&client_len);
printf("test test\n");
pid = fork();
if (pid == 0)
{
if (client_sockfd == -1)
{
perror("Accept error : ");
exit(0);
}
while(1)
{
memset(buf, '0', 255);
if (read(client_sockfd, buf, 255) <= 0)
{
close(client_sockfd);
fclose(fp);
exit(0);
}
if (strncmp(buf, "quit",4) == 0)
{
write(client_sockfd, "bye bye\n", 8);
close(client_sockfd);
fclose(fp);
break;
}
while(fgets(line,255,fp) != NULL)
{
if (strstr(line, buf) != NULL)
write(client_sockfd, line, 255);
memset(line, '0', 255);
}
write(client_sockfd, "end", 255);
printf("send end\n");
rewind(fp);
}
}
}
close(client_sockfd);
}
|
´ÙÀ½Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ´Ù.
¿¹Á¦: zipcode_cli_local.c
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int client_len;
int client_sockfd;
FILE *fp_in;
char buf_in[255];
char buf_get[255];
struct sockaddr_un clientaddr;
if (argc != 2)
{
printf("Usage : ./zipcode_cl [file_name]\n");
printf("¿¹ : ./zipcode_cl /tmp/mysocket\n");
exit(0);
}
client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_sockfd == -1)
{
perror("error : ");
exit(0);
}
bzero(&clientaddr, sizeof(clientaddr));
clientaddr.sun_family = AF_UNIX;
strcpy(clientaddr.sun_path, argv[1]);
client_len = sizeof(clientaddr);
if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0)
{
perror("Connect error: ");
exit(0);
}
while(1)
{
printf("Áö¿ªÀ̸§ ÀÔ·Â : ");
fgets(buf_in, 255,stdin);
buf_in[strlen(buf_in) - 1] = '0';
write(client_sockfd, buf_in, 255);
if (strncmp(buf_in, "quit", 4) == 0)
{
close(client_sockfd);
exit(0);
}
while(1)
{
read(client_sockfd, buf_get, 255);
if (strncmp(buf_get, "end", 3) == 0)
break;
printf("%s", buf_get);
}
}
close(client_sockfd);
exit(0);
}
|
±âÁ¸ÀÇ INET ¹öÁ¯ÀÇ ÇÁ·Î±×·¥°ú ºñ±³ÇØ º¸¸é °íÀÛ 3ÁÙ Á¤µµ¸¸ ¼öÁ¤µÇ¾úÀ½À»
¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ´ÜÁö ¼ÒÄÏ ±¸Á¶Ã¼°¡ sockaddr_un À¸·Î ¹Ù²î°í,
AF_INET ´ë½Å AF_UNIX ¸¦ ±×¸®°í port ¹øÈ£´ë½Å¿¡ ÆÄÀϸíÀ» »ç¿ëÇßÀ½À»
¾Ë¼ö ÀÖ´Ù.
³ª¸ÓÁöÀÇ ¸ðµç ÄÚµå´Â INET ÄÚµå¿Í ¿ÏÀüÈ÷ °°´Ù. ±×·¯¹Ç·Î
Unix Domain Socket ¸¦ »ç¿ëÇϸé Inet Domain Socket ¿Í ÄÚµå Àϰü¼ºÀ»
À¯ÁöÇÒ¼ö ÀÖÀ¸¸ç, µ¿ÀÏÇÑ ±â¼úÀ» »ç¿ëÇØ¼ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¼ö ÀÖ´Ù.
¶ÇÇÑ ´Ù¸¥ ´ëºÎºÐÀÇ IPC ¼³ºñµéÀÌ, ¹ü¿ëÀûÀ¸·Î »ç¿ëÇϱ⿡´Â ºÎÁ·ÇÑ ¿©·¯°¡Áö
´ÜÁ¡µéÀ» °¡Áø¹Ý¸é(´Ü¹æÇâ À̰ųª, Àб⸸ °¡´ÉÇϴٰųª, Á¦¾îÇϱⰡ ¾î·Á¿î)
UDS´Â ¸Å¿ì ¹ü¿ëÀûÀÎ IPC ·Î½á »ç¿ë°¡´ÉÇÏ´Ù¶ó´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.
½ÇÁ¦·Î X ¼¹ö °°Àº°æ¿ì¿¡ ¿ÜºÎ¿¡¼ÀÇ Á¢±Ù½Ã¿¡´Â INET ¿¬°áÀ» ³»ºÎ¿¡¼ÀÇ
¿¬°áÀ» À§Çؼ´Â UDS ¸¦ »ç¿ëÇÑ´Ù. À̹ۿ¡µµ mysql, pgsql, KDE, Gnome °ú °°Àº
´ëºÎºÐÀÇ ¼¹öÇÁ·Î±×·¥ÀÌ ³»ºÎÅë½ÅÀ» À§Çؼ UDS ¸¦ »ç¿ëÇÑ´Ù.
|
|