본문 바로가기
코스웨어/16년 스마트컨트롤러

20160420_장진웅_업무일지_공장내Network_일대일통신5_멀티채팅

by 알 수 없는 사용자 2016. 4. 20.
728x90
반응형

아침에 했던 소스

 #include <stdio.h>          //터미널.pdf 34페이지 참고
 #include <sys/select.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <unistd.h>

 int main(void)
 {
     int iMaxFD;
     fd_set stRFd;       //select에서 만든 구조체, 사용법만 익히자
     iMaxFD = 1;         //항상 +1을 해줘야한다.(키보드를 사용하기 위해선), select함수에서 +1을 하게끔 정해놓은것
     char caBuff[250];
     int iRet;           //개행 문자를 제거하기 위해 선언했다.
     FD_ZERO(&stRFd);    //구조체를 FD_ZERO 를 이용해서 초기화 한다.
     FD_SET(0,&stRFd);   //쓰는방법->FD_SET(번호,&());, 키보드를 감시

     printf("select 실행중 ...\n");
     select(iMaxFD , &stRFd, NULL, NULL, NULL);      //UNIX 617페이지 참조
     printf("--------------------------------");

     iRet = read(0,caBuff,250);                          //select를 통해 들어오는것을 read로 읽자
     //read의 첫번째인자는 키보드를 선택하기위해 0

     //read의 두번째인자는 버퍼(위에 버퍼를 선언해주자)

     caBuff[iRet - 1]    =   0;      //문자열 생성,개행문자를 없애주기 위해 -1

     printf("[%s]\n", caBuff);

     return 0;
 }



client.c

 #include "tcp.h"

 int iCSock;

 void End(int iNum)
 {
     close(iCSock);
     exit(0);
 }

 void sRead(int iNum)
 {
      char caBuff[BSIZE];
      int iRet;

      iRet=read(iCSock , caBuff, BSIZE);
      caBuff[iRet-1]=0;

      printf("\n Incomming Message: [%s]\n", caBuff);

      printf("input Message: ");
      fflush(stdout);
 }

 int main(int iArg, char *cpAcmd[])
 {
     int iRet;
     int iLen;

     fd_set stRFd;

     char caBuff[BSIZE];

     short sPort;
     struct sockaddr_in stServer;


     if(iArg==1)
     {
         sPort=PORT;
     }
     else
     {
         sPort=atoi(cpAcmd[1]);
     }

     iCSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if(iCSock<0)
     {
         printf("can not make a socket \n");
         perror("iCSock");
         return 0;
     }
     iLen=sizeof(stServer);
     bzero(&stServer, iLen);
     stServer.sin_family = AF_INET;
     stServer.sin_addr.s_addr =inet_addr(IP_SERVER);
     //stServer.sin_port = htons(PORT);
     stServer.sin_port = htons(PORT);


     iRet=connect(iCSock, (struct sockaddr *)&stServer,
     if(iRet==-1)
     {
         printf("connect error \n");
         perror("connect");
         close(iRet);
         return 0;
     }

     printf("server is running ... \n");

     signal(SIGINT, End);

     while(1)
     {
     printf("input Message: ");

     fflush(stdout);

     FD_ZERO(&stRFd);
     FD_SET(0,&stRFd);//키보드에서 받은 값을 구조체에 잊
     FD_SET(iCSock, &stRFd);//네트워크에서 받은 값을 저

     select(iCSock+1, &stRFd, NULL, NULL, NULL);

     if(FD_ISSET(0, &stRFd)!=0)
     {
          iRet=read(0, caBuff, BSIZE);
          write(iCSock, caBuff, iRet);
     }

     if(FD_ISSET(iCSock, &stRFd)!=0)
     {
         iRet=read(iCSock, caBuff, BSIZE);

         if(iRet==0)
         {
             printf("server is disconnected \n");
             End(0);
             return 0;
         }

         caBuff[iRet-1]=0;
         printf("\n [server: %s] \n", caBuff);
     }

     }

     close(iCSock);

     return 0;
 }

server.c

 #include "tcp.h"

 int iCSock[MAXUSER];
 int iSSock;

 void sRead(int iNum)
 {
     char caBuff[BSIZE];
     int iRet;


     iRet=read(iCSock , caBuff, BSIZE);
     caBuff[iRet-1]=0;

     printf("\n Incomming Message: [%s]\n", caBuff);

     printf("input Message: ");
     fflush(stdout);
 }

 void End(int iNum)
 {
     close(iCSock);
     close(iSSock);
     exit (0);

 }

 int main(int iArg, char *cpAcmd[])
 {
     int iRet;
     int iLen;
     int iTSock;
     int iUser;
     int iCnt;

     char caBuff[BSIZE];

     int iMaxFD;
     fd_set stRFd;

     short sPort;

     struct sockaddr_in stServer;
     struct sockaddr_in stClient;


     if(iArg==1)
     {
         sPort=PORT;
     }
     else
     {
         sPort=atoi(cpAcmd[1]);
     }



     iSSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

     if(iSSock<0)
     {
         printf("can not make a socket \n");
         perror("iSSock");
         return 0;
     }

     iLen= sizeof(stClient);
     bzero(&stServer, iLen);


     stServer.sin_family = AF_INET;
     stServer.sin_addr.s_addr = INADDR_ANY;
     //stServer.sin_port = htons(PORT);

     stServer.sin_port = htons(sPort);


     iRet=bind(iSSock, (struct sockaddr *)&stServer, iLe

     if(iRet==-1)
     {
         printf("binding error \n");
         perror("bind");
         close(iSSock);
         return 0;
     }

     iRet=listen(iSSock, 5);

     if(iRet==-1)
     {
         printf("listen error \n");
         perror("listen");
         close(iSSock);
         return 0;
     }


     printf("server is running ...[%d] \n", sPort);

     signal(SIGINT, End );



     iUser=0;
     while(1)
     {
         printf("input Message: ");
         fflush(stdout);

         FD_ZERO(&stRFd);
         FD_SET(0,&stRFd);
         FD_SET(iCSock, &stRFd);
         FD_SET(iSSock, &stRFd);

         iMaxFD=iCSock+1;

         select(iMaxFD, &stRFd, NULL, NULL, NULL);

         if(FD_ISSET(iSSock, &stRFd)!=0)
         {

             iTSock=accept(iSSock, (struct sockaddr *)&s

             if(iTSock==-1)
             {
                 printf("accept error \n");
                 perror("accept");
                 continue;
             }

             if(iUSER>=3)
             {
                 close(iTSock);
                 printf("Maxuser is over the number \n")
                 continue;
             }

             iCSock[iUser]=iTSock;
             ++iUser;

         }


         if(FD_ISSET(0, &stRFd)!=0)
         {
             iRet=read(0, caBuff, BSIZE);

             for(iCnt=0; iCnt<iUser; ++iCnt)
             {
                 write(iCSock[iCnt], caBuff, iRet);
             }
         }

         for(iCnt=0; iCnt<iUser; ++iCnt)
         {
             if(FD_ISSET(iCSock[iCnt], &stRFd)!=0)
             {
                 iRet=read(iCSock[iCnt], caBuff, BSIZE);

                 if(iRet==0)
                 {
                     printf("client is disconnected \n")
                     --iUser;
                     iCSock[iCnt]=iCSock[iUser];
                     return 0;
                 }

                 caBuff[iRet-1]=0;
                 printf("\n [client: %s] \n", caBuff);
             }
         }
     }

     return 0;
 }


tcp.h

 #ifndef __TCP_H__
 #define __TCP_H__

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <termios.h>
 #include <sys/stat.h>
 #include <sys/signal.h>
 #include <stdlib.h>
 #include <sys/time.h>

 #define BSIZE 250
 #define IP_SERVER "192.168.1.60"
 #define PORT 10000
 #define MAXUSER 3


 #endif //__TCP_H__


<출력결과>


오늘 수업 요약.



728x90