728x90

입출력 루틴 분할

- 클라이언트의 프로세스를 fork 하여 입력을 담당하는 프로세스와 출력을 담당하는 프로세스로 따로 사용

- 입출력 루틴을 분할하면 보내는 것과 받는 것을 동시에 진행할 수 있음

int main(int argc, char *argv[])
{
    int sock;
    pid_t pid;
    char buf[BUF_SIZE];
    struct sockaddr_in serv_adr;
    ...;
    
    sock=socket(PF_INET, SOCK_STREAM, 0);  
    ...;
    
    if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
        printf("connect() error!");
    }
    
    pid=fork();
    
    if(pid==0) {
        write_routine(sock, buf);
    }
    else {
        read_routine(sock, buf);
    }
    
    close(sock);
    return 0;
}

void read_routine(int sock, char *buf)
{
    while(1)
    {
        int str_len=read(sock, buf, BUF_SIZE);
        if(str_len==-1) { continue; }
        
        buf[str_len]=0;
        printf("Message from server: %s", buf);
    }
}
void write_routine(int sock, char *buf)
{
    while(1)
    {
        fgets(buf, BUF_SIZE, stdin);
        if(!strcmp(buf,"q\n") || !strcmp(buf,"Q\n"))
        {	
            shutdown(sock, SHUT_WR);
            return;
        }
        write(sock, buf, strlen(buf));
    }
}
728x90

+ Recent posts