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

20160419_장진웅_업무일지_공장내Network_일대일통신4_양방향 채팅

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

유닉스 고급 프로그래밍 p385

시그널 - 소프트웨어 인터럽트


자바에서는 이벤트


p389 SIGINT에 대해서 나와 있다.

p393 SIGINT에 대한 설명.

전경프로세스는 제일 앞의 프로세스를 의미한다. fore ground=전경프로세스

foreground <-> background


p397 Signal 함수.


<<양방향 채팅>>

client.c

#include "tcp.h"

int iCSock;

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

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

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

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

int main(void)
{
    int iRet;
    int iLen;
    char caBuff[BSIZE];

    struct sockaddr_in stServer;

    iCSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(iCSock<0)
    {
        printf("can not make a socket \n");
        perror("iCSock");
        return 0;
    }

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

    iLen=sizeof(stServer);

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

    signal(SIGIO, sRead);
    fcntl(iCSock, F_SETOWN, getpid());
    fcntl(iCSock, F_SETFL, FASYNC);

    while(1)
    {
        iRet=read(0 , caBuff, BSIZE);
        fflush(stdin);
        write(iCSock, caBuff, iRet);
    }

    close(iCSock);

    return 0;
}

server.c

#include "tcp.h"

 int iCSock;
 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(void)
 {
     int iRet;
     int iLen;
     char caBuff[BSIZE];

     struct sockaddr_in stServer;
     struct sockaddr_in stClient;


     iSSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

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

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


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

     stServer.sin_port = htons(PORT);


     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;
     }

         iCSock=accept(iSSock, (struct sockaddr *)&stCli

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

     signal(SIGINT, End );
     signal(SIGIO, sRead );
     fcntl(iCSock, F_SETOWN, getpid());
     fcntl(iCSock, F_SETFL, FASYNC);

     while(1)
     {
         printf("input Message: ");
         fflush(stdout);
         iRet=read(0, caBuff, BSIZE);
         write(iCSock, caBuff, iRet);
     }

     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>

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

 #endif //__TCP_H__

<출력결과>





728x90