728x90

Iterative 서버

- 다수의 클라이언트에 서비스를 제공할 수 있는 서버

- 접속한 클라이언트의 소켓을 close 후 다시 accept하여 다른 클라이언트와 연결해 데이터를 송수신하는 구조

- 1:N으로 통신할 수는 없음

- close 후 다시 accpet를 호출하여 다른 클라이언트의 연결을 받음

    -> 서버 코드

int main(int argc, char *argv[])
{
    serv_sock=socket(PF_INET, SOCK_STREAM, 0);   
    
    if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
        printf("bind() error");
    }
    
    if(listen(serv_sock, 5)==-1) {
        printf("listen() error");
    }
    
    clnt_adr_sz=sizeof(clnt_adr);
    
    for(i=0; i<5; i++)
    {
        clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
        if(clnt_sock==-1) {
            printf("accept() error");
        }
        else {
            printf("Connected client %d \n", i+1);
        }
        
        while((str_len=read(clnt_sock, message, BUF_SIZE))!=0) {
            write(clnt_sock, message, str_len);
        }
        
        close(clnt_sock);
    }
    
    close(serv_sock);
    return 0;
}

    -> 클라이언트 코드

int main(int argc, char *argv[])
{
    ... 
    sock=socket(PF_INET, SOCK_STREAM, 0);   
    ...
    
    if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
        printf("connect() error!");
    }
    else {
        printf("Connected...........");
    }
    
    while(1) 
    {
        fputs("Input message(Q to quit): ", stdout);
        fgets(message, BUF_SIZE, stdin);
        
        if(!strcmp(message,"q\n") || !strcmp(message,"Q\n")) {
            break;
        }
        
        write(sock, message, strlen(message));
        str_len=read(sock, message, BUF_SIZE-1);
        message[str_len]=0;
        printf("Message from server: %s", message);
    }
    
    close(sock);
    return 0;
}

 

728x90

+ Recent posts