1 / 1 / 0
Регистрация: 18.02.2019
Сообщений: 160
1

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

22.04.2020, 19:12. Показов 800. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Пишу калькулятор: сервер отправляет польскую запись на сервер, сервер ее получает и выводит результат на экран
Это все работает. Но как обеспечить отправку клиенту результата выполнения?
Пробовала с использованием send/read, но что-то не так, видимо
Спасибо
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//клиент
#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;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2020, 19:12
Ответы с готовыми решениями:

tcp сокет, клиент-сервер
Здравствуйте! Встретилась с такой проблемой: пишу сокет, у меня есть клиент, который : 1)получает...

TCP/IP клиент-сервер (не знаю как отправить текст от сервера к клиенту)
Помогите пожалуйста научился отправлять от клиента к серверу но наоборот никак не получается...

TCP-сервер и TCP-клиент. Клиент не находит файл.
Всем привет! Решил изучать передачу данных по сети и начал с освоения примера, приведённого в...

TCP. Отправка сообщений от сервера к клиенту
Всем привет. У меня есть программа-клиент и программа-сервер. На сервере успешно создается сокет....

1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.04.2020, 10:05 2
Цитата Сообщение от Margaretti Посмотреть сообщение
Это все работает. Но как обеспечить отправку клиенту результата выполнения?
Ты же отправляешь клиенту "Welcome to Server ...", непонятно зачем. Сделай по аналогии - сформируй на сервере строку с результатом и отправь её клиенту.
0
23.04.2020, 10:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2020, 10:05
Помогаю со студенческими работами здесь

Если сервер TCP то и клиент тоже должен быть TCP?
Я полный новичок И я так понимаю есть TCP client (Sockets), TCP server (Sockets), и ClientSocket...

tcp ip как клиенту найти сервер?
Есть 2 приложения: сервер и клиент, работающих на разных компьютерах. Клиенту нужен ip сервера,...

как создать TCP клиент, TCP сервер ? На С++
Очень нужна помощь!Как написать TCP клиент, TCP сервер. Например,клиент вводит строку с клавиатуры...

Как передать tcp клиенту что сервер занят ?
Имеется клиент и сервер (boost::asio tcp). В нормальной ситуации после установления соединения...

Как передать tcp клиенту что сервер занят ?
Имеется клиент и сервер (boost::asio tcp). В нормальной ситуации после установления соединения...

Клиент и сервер сокет
Например у меня сервер у моего друга клиент. Друг скачивает мне файл весом 10 мгб. В процессе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru