2012-01-23 2 views
0

클라이언트 코드 :클라이언트 서버 프로세스 실행

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

    void error(const char *msg) 
    { 
      perror(msg); 
      exit(0); 
    } 


    int main(int argc, char *argv[]) 
    { 
     int sockfd, portno, n,choice; 
     struct sockaddr_in serv_addr; 
     struct hostent *server; 

       int buffer; 

     if (argc < 3) 
     { 
       fprintf(stderr,"usage %s hostname port\n", argv[0]); 
       exit(0); 
      } 

     portno = atoi(argv[2]); 
     sockfd = socket(AF_INET, SOCK_STREAM, 0); 

     if (sockfd < 0) 
       error("ERROR opening socket"); 
       server = gethostbyname(argv[1]); 

     if (server == NULL) 
     { 
       fprintf(stderr,"ERROR, no such host\n"); 
       exit(0); 
      } 

      serv_addr.sin_family = AF_INET; 
      bcopy((char *)server->h_addr, 
      (char *)&serv_addr.sin_addr.s_addr,server->h_length); 
      serv_addr.sin_port = htons(portno); 

     if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
       error("ERROR connecting"); 

     //printf("Please enter positive integer "); 

     printf("Enter your choice\n1=Prime number\n2=Fibonacci number\n 3=power of 2\n"); 
     scanf("%d",&choice); 

     if(choice==1){ 
     printf("Please enter positive integer "); 
     scanf("%d", &buffer); 
     } 

      n = write(sockfd,&buffer,sizeof(buffer)); 

     if (n < 0) 
      error("ERROR writing to socket"); 
     char msg[256]; 
     bzero(msg, 256); 

     n=read(sockfd, msg, 255); 

     printf("%d %s\n",buffer, msg); 

     close(sockfd); 
      return 0; 
} 

서버 코드 :이 클라이언트 - 서버 프로세스에서

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

    void error(const char *msg) 
    { 
      perror(msg); 
      exit(1); 
    } 

    int prime(int num) 
    { 
     int c; 

     for (c = 2 ; c <= num - 1 ; c++) 
     { 
       if (num%c == 0) 
       { 
        return 0; 
       } 
     } 

     if (c == num) 
      return 1; 

     return 0; 

    } 


    int main(int argc, char *argv[]) 
    { 
     int sockfd, newsockfd, portno; 
      socklen_t clilen; 
      int buffer; 
      struct sockaddr_in serv_addr, cli_addr; 
      int n; 
     int i=1; 

     if (argc < 2) 
     { 
       fprintf(stderr,"ERROR, no port provided\n"); 
       exit(1); 
      } 

     sockfd = socket(AF_INET, SOCK_STREAM, 0); 

     if (sockfd < 0) 
       error("ERROR opening socket"); 

      portno = atoi(argv[1]); 
      serv_addr.sin_family = AF_INET; 
      serv_addr.sin_addr.s_addr = INADDR_ANY; 
      serv_addr.sin_port = htons(portno); 

     if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR on binding"); 

     listen(sockfd,5); 
      clilen = sizeof(cli_addr); 
      newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen); 

      if (newsockfd < 0) 
       error("ERROR on accept"); 



      n = read(newsockfd,&buffer,sizeof(buffer)); 

     int result= prime(buffer); 

     if (n < 0) error("ERROR reading from socket"); 


      printf("Client's input is: %d\n",buffer); 

     if(result==1) 
     { 

      n = write(newsockfd,"is Prime Number",18); 
       if (n < 0) error("ERROR writing to socket"); 
     } 

     else 
     { 
      n = write(newsockfd,"is not Prime Number",18); 
       if (n < 0) error("ERROR writing to socket"); 
     } 





      close(newsockfd); 
      close(sockfd); 
      return 0; 
    } 

, 서버 프로그램을 먼저 실행 후 종료 . 내가 하나 이상의 PC에 클라이언트 프로그램을 유지하는 경우

  1. 서버는 각 클라이언트는 통신 및 서버 프로그램이 종료되지 않습니다 수있을 것입니다, 무한
  2. 를 실행합니다 :에 나는 원한다.

답변

2

분명히 루프하고 포크해야합니다.

0

accept/read/write/close 주위의 무한 루프로 인해 서버가 계속 실행됩니다.

다중 연결을 동시에 허용하는 경우 accept 뒤에 새 프로세스 또는 스레드를 만들 수 있습니다. 다른 하나는 소켓을 비 차단 (Google은 친구입니다!)하고 select 또는 poll과 같은 폴링 기능을 사용하는 것입니다. https://github.com/H2CO3/TCPHelper

기본 트릭은 당신이 무한 루프에() 귀하의 동의를 종료해야하고, 포크() 또는 이제까지 받아 conection에 후 새 스레드를 만들 것이다 :

0

서버 측

while (1){ 

     listen(sockfd,5); 
      clilen = sizeof(cli_addr); 
      newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen); 

      if (newsockfd < 0) 
       error("ERROR on accept"); 



      n = read(newsockfd,&buffer,sizeof(buffer)); 

     int result= prime(buffer); 

     if (n < 0) error("ERROR reading from socket"); 


      printf("Client's input is: %d\n",buffer); 

     if(result==1) 
     { 

      n = write(newsockfd,"is Prime Number",18); 
       if (n < 0) error("ERROR writing to socket"); 
     } 

     else 
     { 
      n = write(newsockfd,"is not Prime Number",18); 
       if (n < 0) error("ERROR writing to socket"); 
     } 


    } 

에 클라이언트 측 :

//printf("Please enter positive integer "); 
    while (choice != -1){ 
     printf("Enter your choice\n1=Prime number\n2=Fibonacci number\n 3=power of 2\n"); 
     fflush(stdin); 
     scanf("%d",&choice); 

     if(choice==1){ 
     printf("Please enter positive integer "); 
     scanf("%d", &buffer); 
     } 

     n = write(sockfd,&buffer,sizeof(buffer)); 

     if (n < 0) 
      error("ERROR writing to socket"); 
     char msg[256]; 
     bzero(msg, 256); 

     n=read(sockfd, msg, 255); 

     printf("%d %s\n",buffer, msg); 
    }// end of while (choice != -1){ 

서버 측에서 프로세스를 생성해야 프로세스 동기화 시스템을 구현할 수 있습니다. 중요 섹션, 리소스 잠금 등

관련 문제