2012-01-23 10 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; 
} 

Serverコード:このクライアント・サーバ・プロセスで

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

、サーバプログラムは、最初の実行後に終了されます。私がしたい:

  1. サーバーは、私は複数のPCにクライアントプログラムを続ける場合は、各クライアントが通信することができるようになりますし、サーバープログラムが終了されることはありません無限に
  2. を実行します。

答えて

2

あなたは明らかにループしてフォークする必要があります。

0

accept/read/write/closeの周りの無限ループは、サーバーを稼働させ続けるでしょう。

複数の接続を同時に受け付ける場合は、acceptの後に新しいプロセスまたはスレッドを作成するかどうかを選択できます。もう1つは、ソケットを非ブロッキング(Googleはあなたの友人です!)にし、selectpollのようなポーリング機能を使用しています。

0

このタスクの私の実装を参照してください。 https://github.com/H2CO3/TCPHelper

基本的なトリックは、あなたが無限ループにあなたの受け入れ()を閉鎖する必要がある、とフォーク()、またはこれまでに受け入れられたった後、新しいスレッドを作成しますということです。

あなたは私のヘルパー関数を使用しない場合、あなたはここにいくつかのかなり良いのチュートリアルが表示されます:クライアント側で http://www.linuxhowtos.org/C_C++/socket.htm

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){ 

サーバー側では、プロセスを作成し、プロセス同期システムを実装する必要があります。クリティカルセクション、ロックリソースなど

関連する問題