代码之家  ›  专栏  ›  技术社区  ›  Westfall

c++linux套接字服务器重复调用客户端

  •  1
  • Westfall  · 技术社区  · 7 年前

    因此,我对如何让服务器与客户端来回发送数据感到困惑。目前,服务器将向客户端发送数据,然后客户端将返回答案,但我不知道如何在不反复启动客户端服务器的情况下多次执行此操作。

    基本上,我想知道如何让服务器和客户端在不创建新客户端的情况下重复通信。

    这是我的服务器代码。我创建了一个随机数,然后使用客户端确定其因子

    #include <iostream>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <time.h> 
    #include <cmath>
    
    using namespace std;
    
    int *findPrimes(int primeArray[])
    {
        int i, j, n = 100000, flag;
        //int primeArray[65];
        int count = 0;
    
        for(i = 2; i <= n; i++)
        {
            flag = 1;
            for(j =2;j<=i/2;j++)
            {
                if(i%j==0)
                {
                    flag = 0;
                    break;
                }
            }
            if(flag==1)
            {
                primeArray[count] = i;
                count++;
            }
        }
        return primeArray;
    }
    
    int calcNumber()
    {
        srand(time(NULL));
    
        int base = rand()%9 + 2;
        int numCalc[5];
        bool isntBase = false;
        int count = 0;
        int testNum;
    
        do{
            testNum = rand() % 100000;
            int number = testNum;
            cout << base << ", " << number << endl;
            count = 0;
            isntBase = false;
    
            for(int i = 0; i < 5; i++)
            {
                numCalc[i] = 0;
            }
    
            while (number > 0)
            {
                int digit = number%10;
                number /= 10;
                numCalc[count] = digit;
                count++;
                if(digit >= base)
                {
                    isntBase = true;
                }
            }
        }while(isntBase == true);
    
        cout << testNum << "(" << base <<")";
        int decConvert = 0;
        int baseMult = 1;
        for(int i = 0; i < 5; i++)
        {
            //cout << numCalc[i] << endl;
            decConvert += numCalc[i]*(pow(base, i));
            //baseMult = baseMult * 7;
            //cout << decConvert << endl;
        }
        cout << " = " << decConvert << "(10) = ";
        return decConvert;
    }
    
    
    int main(int argc, char *argv[])
    {
        int listenfd = 0, connfd = 0;
        struct sockaddr_in serv_addr; 
    
        char sendBuff[1025];
        time_t ticks; 
    
        int n = 3;
        int numOfPrime= 0;
        bool isPrime = false;
        bool noMorePlease = false;
        int y[9592];
        int *prime = findPrimes(y);
    
        int number = calcNumber();
    
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        memset(&serv_addr, '0', sizeof(serv_addr));
        memset(sendBuff, '0', sizeof(sendBuff)); 
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_addr.sin_port = htons(5575); 
    
        bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 
    
        listen(listenfd, 2); 
    
        int prcount = 0;
    
        while(noMorePlease == false){
            //Thread
    
            int client_socket;
            client_socket = accept(listenfd, NULL, NULL);
    
            int primeNum = prime[prcount];
            send(client_socket, &number, sizeof(number),0);
            send(client_socket, &primeNum,sizeof(primeNum), 0);
    
            int recvNum = 0;
            //char recvVal[256];   
            //recv(listenfd, &number, sizeof(number), 0);
            recv(client_socket, &recvNum, sizeof(recvNum), 0);
    
            //cout << endl << recvNum;
    
            if(recvNum >0)
            {
                cout << prime[prcount] << "^" << recvNum <<"*";
            }
            while(recvNum > 0)
            {
                number = number/prime[prcount];
                recvNum--;
            }
            prcount++;
            if(number == 1)
            {
                cout << endl;
                numOfPrime = 0;
                noMorePlease = true;
            }
            if(prcount > 9592)
            {
                numOfPrime++;
                cout << " a prime number!" << endl;
                numOfPrime++;
                if(numOfPrime == n)
                {
                    noMorePlease = true;
                    cout << "There were " << n << " primes in a row" << endl;
                    close(listenfd);
                    return 0;
                }
            }
            //close(client_socket);
        }
    
        close(listenfd);
        return 0;
    }
    

    这是我的客户代码

    #include <iostream>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <arpa/inet.h> 
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int sockfd = 0, n = 0;
        char recvBuff[1024];
        struct sockaddr_in serv_addr; 
    
    
        if(argc != 2)
        {
            printf("\n Usage: %s <ip of server> \n",argv[0]);
            return 1;
        } 
    
        memset(recvBuff, '0',sizeof(recvBuff));
        if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            printf("\n Error : Could not create socket \n");
            return 1;
        } 
    
        memset(&serv_addr, '0', sizeof(serv_addr)); 
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(5575); 
    
        if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
        {
            printf("\n inet_pton error occured\n");
            return 1;
        } 
    
        if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
        {
           printf("\n Error : Connect Failed \n");
           return 1;
        } 
        int number = 0;
        int primeNum;
        char recvVal[256];   
        recv(sockfd, &number, sizeof(number), 0);
        recv(sockfd, &primeNum, sizeof(primeNum), 0);
    
        int divCount = 0;
    
        cout << number << ", " << primeNum << endl;
        while(number % primeNum == 0)
        {
            cout << number << ",  ";
            number =  number/primeNum;
            divCount++;
        }
    
        cout << endl << divCount;
        send(sockfd, &divCount,sizeof(divCount), 0);
    
        /*
        while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
        {
            recvBuff[n] = 0;
            if(fputs(recvBuff, stdout) == EOF)
            {
                printf("\n Error : Fputs error\n");
            }
        } 
    
        if(n < 0)
        {
            printf("\n Read error \n");
        } 
    */
        close(sockfd);
        return 0;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Yiannis Mpourkelis    7 年前

    在客户端代码中,在第行之后:

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    

    你应该 recv公司 邮寄 在循环内部,以便连接保持打开状态。完成后,退出循环并关闭套接字。这里可以找到使用同步套接字的此方法的示例: https://vcansimplify.wordpress.com/2013/03/14/c-socket-tutorial-echo-server/