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