tcp сокет, клиент-сервер повторная отправка клиенту

Пишу калькулятор: сервер отправляет польскую запись на сервер, сервер ее получает и выводит результат на экран Это все работает. Но как обеспечить отправку клиенту результата выполнения? Пробовала с использованием send/read, но что-то не так, видимо Спасибо

//клиент
#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>
#define MAXDATASIZE 2000
#define SIZE 100

int main(void)
{

    int sockfd = 0;
    int n = 0;
    char recvBuff[100];
    struct sockaddr_in serv_addr;

  memset(recvBuff, '0' ,sizeof(recvBuff));

  if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
    {
      printf("\n Error : Could not create socket \n");
      return 1;
    }

  serv_addr.sin_family = AF_INET; // системный порядок
  serv_addr.sin_port = htons(5000); // сетевой порядок
  serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //объявлен для прослушивания внутренней сети.


  if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0) //подключаемся к серверу
    {
      printf("\n Error : Connect Failed \n");
      return 1;
    }

   while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
     {
         //пока есть в буфере
       recvBuff[n] = 0;
       if(fputs(recvBuff, stdout) == EOF)
     {
       printf("\n Error : Fputs error");
     }
       printf("\n");
         // информация, которую хотим передать
         // 1 2 3 4 + * + =

               char toCalculate[SIZE];
           size_t len;
           if (fgets(toCalculate, sizeof(toCalculate), stdin) == NULL || strlen(toCalculate) == 1)
               return 1;
           len = strlen(toCalculate);
         toCalculate[len - 1] = '\0';
         sprintf(recvBuff, "%s", toCalculate);
        send(sockfd, recvBuff, MAXDATASIZE, 0);

        printf("Client sent %s to %s\n",recvBuff, inet_ntoa(serv_addr.sin_addr));
     }


  if( n < 0)
    {
      printf("\n Read Error \n");
    }

  return 0;
}


// SERVER
#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>
#define MAXDATASIZE 2000



int calcucator (char sendBuff[])
{
    int stack[1000];
    int c;      // очередной символ из буфера
    int sp = 0; // sp = индекс ячейки, куда будет push-иться очередное число
    int result = 0;
    int i;// результат всех вычислений
    for (i = 0; i < sendBuff[i] != '\0'; i++)   // проходим по всем символам в буфере
    {
        c = sendBuff[i];    // "достаем" очередной символ из буфера
        switch (c)
        {
            case ' ':
                break;
            case '=':
                result = stack[sp-1]; break;
            case '+':
                stack[sp-2] += stack[sp-1]; sp--; break;
            case '-':
                stack[sp-2] -= stack[sp-1]; sp--; break;
            case '*':
                stack[sp-2] *= stack[sp-1]; sp--; break;
            case '/':
                if (stack[sp-1] != 0)
                {
                    stack[sp-2] /= stack[sp-1];
                    sp--;
                }
                else    // а иначе у нас деление на 0
                {
                    fprintf(stderr, "Error! Division by zero!\n");
                }
                break;
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                stack[sp++] = c-'0';
                break;
            default:
                // если символ не является числом
                fprintf(stderr, "Can't read integer\n");
        }
    }
    printf("Result = %d\n", result);
    return result;
    }


int main(void)
{
    int servSock = 0;
    int cliProc = 0;
   char sendBuff[100];
   char msg[MAXDATASIZE];
    int result = 0;

  socklen_t sin_size;

    struct sockaddr_in serv_addr;
    struct sockaddr_in income_addr;

  servSock = socket(AF_INET, SOCK_STREAM, 0);
  printf("socket retrieve success\n");

  memset(&serv_addr, 0, sizeof(serv_addr));
  memset(&income_addr, 0, sizeof(income_addr));
  memset(sendBuff, 0, sizeof(sendBuff));

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //Разрешить любой входящий IP-адрес, объявив INADDR_ANY
  serv_addr.sin_port = htons(5000);//Объявим порт 5000 для использования.


  bind(servSock, (struct sockaddr*)&serv_addr,sizeof(serv_addr));

  if(listen(servSock, 10) == -1)
  {
      printf("Failed to listen\n");
      return -1;
  }

  while(1)
    {
      sin_size = sizeof(struct sockaddr_in);

      cliProc = accept(servSock, (struct sockaddr*)&income_addr ,&sin_size); // accept awaiting request

    sprintf(msg, "Welcome to Server, you addr is %s", inet_ntoa(income_addr.sin_addr));

    send(cliProc, msg, strlen(msg), 0);

        if (recv(cliProc, sendBuff, MAXDATASIZE, 0) == -1)
        {
            continue;
        }
        else
        {
            printf("Server received %s from %s\n", sendBuff, inet_ntoa(income_addr.sin_addr));
            puts(sendBuff);
             int len = strlen(sendBuff);
            int i;
            for(i=0; i<len; i++)
            {
                result = calcucator(&sendBuff[i]);
            }


        }

      close(cliProc);
      close(servSock);
      sleep(1);
    }

  return 0;
}

Ответы (0 шт):