티스토리 뷰

Application/C/C++

리눅스 채팅 서버

알 수 없는 사용자 2010. 12. 1. 04:13

Source : http://blog.naver.com/muwoo850502/50032210336

   1: #include<stdio.h>
   2: #include<string.h>
   3: #include<sys/types.h>
   4: #include<sys/socket.h>
   5: #include<netinet/in.h>
   6: #include<arpa/inet.h>
   7: #include<unistd.h>
   8: #include<errno.h>
   9:  
  10: #define PORT 7777
  11: #define MAXPENDING 5
  12: #define BUFSIZE 1024
  13:  
  14: main()
  15: {
  16:  int servSockfd;
  17:  int clntSockfd;
  18:  struct sockaddr_in servSockfd;
  19:  struct sockaddr_in clntSockfd;
  20:  char recvBuffer[BUFSIZE];
  21:  char sendBuffer[BUFSIZE];
  22:  int clntLen;
  23:  int recvLen;
  24:  
  25:  /*소켓 생성*/
  26:  if((servSockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  27:  {
  28:   perror("sock failed");
  29:   exit(1);
  30:  }
  31:  /*servaddr를 0으로 초기화*/
  32:  memset(&servAddr,0,sizeof(servAddr));
  33:  /*servaddr에 주소 정보 저장*/
  34:  servAddr.sin_family=AF_INET;
  35:  servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
  36:  servAddr.sin_port-htons(PORT);
  37:  
  38:  /*servsockfd 소켓에 주소정보 연결*/
  39:  if(bind(servSockfd,(struct sockaddr*)&servAddr,sizeof(servAddr))==-1)
  40:  {
  41:   perror("bind failed");
  42:   exit(1);
  43:  }
  44:  
  45:  /*servsockfd 소켓에 들어오는 클라이언트 요청 기다림*/
  46:  if(listen(servSockfd,MAXPENDING)==-1)
  47:  {
  48:   perror("listen failed");
  49:   exit(1);
  50:  }
  51:  
  52:  /*무한반복*/
  53:  while(1)
  54:  {
  55:   clntLen=sizeof(clntAddr);
  56:   /*servSockfd 소켓으로 들어오는 클라리언트 요청 받아들임*/
  57:   if((clntSockfd=accept(servSockfd,(struct sockaddr*)&clntAddr,&clntLen))==-1)
  58:   {
  59:    perror("accept failed");
  60:    exit(1);
  61:   }
  62:   printf("client is in\n");
  63:   /*자식프로세스 생성*/
  64:   switch(fork())
  65:   {
  66:   case -1:
  67:    perror("fork failed");
  68:    exit(1);
  69:  
  70:    /*자식프로세스는*/
  71:   case 0:
  72:    close(servSockfd);
  73:    /*임의의 클라이언트에 대해 반복*/
  74:    while(1)
  75:    {
  76:     /*clntSockfd 소켓으로 들어오는 데이터를 받아 recvBuffer에 저장*/
  77:     if((revcLen=recv(clntSockfd,recvBuffer,BUFSIZE,0))==-1)
  78:     {
  79:      perror("recv failed");
  80:      exit(1);
  81:     }
  82:     /*클라이언트가 연결을 끊으면 recv는 0을 반환*/
  83:     if(recvLen==0)
  84:      break;
  85:  
  86:     recvBuffer[recvLen]='?';
  87:     /*받은 데이터를 출력*/
  88:     printf("%s\n",recvBuffer);
  89:    }
  90:    close(clntSockfd);
  91:    exit(0);
  92:  
  93:    /*부모 프로세스는*/
  94:   default:
  95:    while(1)
  96:    {
  97:     /*터미널로부터 데이터 입력*/
  98:     fgets(sendBuffer,BUFSIZE,stdin);
  99:  
 100:     /*입력받은 데이터를 클라이언트에게 보냄*/
 101:     if(send(clntSockfd,sendBuffer,strlen(senBuffer),MSG_NOSIGNAL)!=strlen(sendBuffer))
 102:     {
 103:      /*상대방의 연결이 끊겨 호출에 실패하면 erroe에는 EPIPE가 저장*/
 104:      if(errno==EPIPE)
 105:      {
 106:       printf("client is out\n");
 107:       break;
 108:      }
 109:      perror("send failed");
 110:      exit(1);
 111:     }
 112:    }
 113:   }
 114:   close(clntSockfd);
 115:  }
 116: }

'Application > C/C++' 카테고리의 다른 글

포인터는 왜 어려울까?  (0) 2011.03.21
리눅스 채팅 클라이언트  (0) 2010.12.01
주변광 센서를 이용한 보다 스마트한 기기 구현하기  (0) 2010.11.02
D3DFORMAT  (0) 2010.11.02
[CPP] 디버깅에 관하여  (0) 2010.08.24