Клиентский сервер Выполнение процесса путем программирования сокетов в c - PullRequest
0 голосов
/ 23 января 2012

Код клиента:

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

В этом процессе клиент-сервер программа сервера завершаетсяпосле первого исполнения.Я хочу:

  1. Сервер будет работать бесконечно
  2. Если я сохраню клиентскую программу более чем на одном компьютере, каждый клиент сможет общаться, и серверная программа не будет прервана.

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Тогда вам, очевидно, потребуется цикл и разветвление.

0 голосов
/ 23 января 2012

на стороне сервера

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

На стороне сервера вам нужно создать процесс и, возможно, вы сможете внедрить систему синхронизации процессов. Критический раздел, блокировка ресурсов и т. Д.

0 голосов
/ 23 января 2012

Смотрите мою реализацию этой задачи: https://github.com/H2CO3/TCPHelper

Основная хитрость заключается в том, что вам нужно закрыть ваш accept () в бесконечный цикл и fork () или создать новый поток после того, как когда-либо будет принято соединение.

если вы не хотите использовать мои вспомогательные функции, вы увидите здесь довольно хорошие уроки: http://www.linuxhowtos.org/C_C++/socket.htm

0 голосов
/ 23 января 2012

Бесконечный цикл вокруг accept / read / write / close будет поддерживать работу вашего сервера.

Что касается одновременного приема нескольких соединений, у вас есть выбор создания новогопроцесс или поток после accept.Другой способ заключается в том, чтобы сделать сокеты неблокирующими (Google - ваш друг!) И использовать функции опроса, такие как select или poll.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...