Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С под Linux

Войти
Регистрация
Восстановить пароль
 
MeriKh
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 8
#1

Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам... - C Linux

13.12.2016, 00:53. Просмотров 509. Ответов 9
Метки нет (Все метки)

Есть сервер и несколько клиентов. Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам. Прошу помочь разобраться.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 00:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам... (C Linux):

Не отправляет сообщение клиентам - C++
Пишу сетевой чат на С++ Есть клиент-сервер (сокет-сервер), при получении сообщения он отправляет данное сообщение клиенту, который его...

Почтовый сервер отправляет сообщение с вирусом - Безопасность
Здравствуйте. Дано: В организации используется 2 почтовых сервера Kerio Connect 8.2 для домен1 и домен2. Сервера находятся в разных...

Клиент читает из файла несколько пар чисел, отправляет их на сервер в двоичном виде, получает произведение - C++ Qt
Клиент читает из файла несколько пар чисел, отправляет их на сервер в двоичном виде, получает произведения этих чисел также в двоичном...

Функция mail не отправляет письма на gmail, а на остальные отправляет - PHP
Вот код отправки $from = 'register@gmail.com'; $message = 'Login - <strong>' . $name . '</strong><p>Mail - <strong>' . $email ....

TCP клиент -сервер, не отправляется сообщение клиентам - C#
Приветствую. Нужно написать клиент-сервер, используя сокеты. Написал сервер и клиент, клиент видит сервер и подключается к нему, при...

Сервер отправляет объект не null, а клиент принимает null - C# WCF
Помогите пожалуйста! У меня в клиент-серверном приложении творится что-то странное! Короче с сервера на клиент посылается задача, но на...

9
sharpey
138 / 128 / 21
Регистрация: 21.09.2008
Сообщений: 401
13.12.2016, 18:19 #2
Прочие клиенты тоже могут слать широковещательные сообщения?
0
Humanoid
Почетный модератор
9854 / 3753 / 171
Регистрация: 12.06.2008
Сообщений: 11,504
13.12.2016, 20:32 #3
В чём именно проблема? Если использовать TCP, то: Сервер принимает подключения от клиентов. При каждом подключении добавляет сокет нового клиента в список. Когда от любого клиента приходит хоть какие-то данные, то сервер рассылает эти данные остальным клиентам.
На каком этапе возникли сложности?
0
MeriKh
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 8
13.12.2016, 20:44  [ТС] #4
да, могут

Добавлено через 1 минуту
у меня проблема с кодом клиента, клиент получает сообщение или отправляет, но так не получается.

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
int main()
{
char sin[1024], sout[1024];
 
int sd;
struct sockaddr_in addr;
char *host = "127.0.0.1";
 
sd = socket(PF_INET, SOCK_STREAM, 0);
 
if (sd < 0) {
perror("socket");
}
 
bzero(&addr, sizeof(addr));
 
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
inet_aton(host, &addr.sin_addr);
int* new_sock;
 
connect(sd, (struct sockaddr *) &addr, sizeof(addr));
fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
 
FD_SET(sd, &rfds);
FD_SET(sd, &wfds);
if(select(sd + 1, &rfds, &wfds, NULL, (struct timeval *)NULL) < 0) {
perror("select");
return -1;
}
 
if(FD_ISSET(sd, &rfds))
{
recv(sd, sout, sizeof(sout), 0);
printf("%s\n", sout);
}
else if(FD_ISSET(sd, &wfds))
{
fgets(sin, 1023, stdin);
send(sd, sin, sizeof(sin), 0);
recv(sd, sout, sizeof(sout), 0);
printf("%s\n", sout);
}
}
0
Humanoid
Почетный модератор
9854 / 3753 / 171
Регистрация: 12.06.2008
Сообщений: 11,504
13.12.2016, 21:13 #5
Цитата Сообщение от MeriKh Посмотреть сообщение
select(sd + 1, &rfds, &wfds
А зачем вам ожидать готовность для записи? У вас программа будет всё время попадать в"else if(FD_ISSET(sd, &wfds))". Вы только введёте одно сообщение, как программа его отправит, примет ответ и начнёт запрашивать следующее. В этом случае проверять "if(FD_ISSET(sd, &rfds))" бессмысленно, т.к. вы туда вряд ли когда-нибудь попадёте.

И цикла не хватает. Сейчас программа один раз будет запрашивать данные с клавиатуры, отправит их, получит ответ и после этого будет выходить.

В общем, чего-то катострофического в коде клиента не вижу... под задачу, описанную в первом сообщении, подходит. Он будет отправлять сообщение и ждать отклика от сервера.
0
MeriKh
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 8
13.12.2016, 21:40  [ТС] #6
в как мне изменить код, чтобы клиент получил сообщение?
0
Humanoid
Почетный модератор
9854 / 3753 / 171
Регистрация: 12.06.2008
Сообщений: 11,504
14.12.2016, 00:12 #7
Цитата Сообщение от MeriKh Посмотреть сообщение
в как мне изменить код, чтобы клиент получил сообщение?
В какой момент времени? У вас он и так вначале отправляет, а потом получает сообщение. Или вы хотите, что бы пока вы печатаете сообщение с клавиатуры, а в это время клиент может получить сообщение?
0
MeriKh
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 8
14.12.2016, 00:38  [ТС] #8
в любой момент времени могут и получить, и отправить
0
Humanoid
Почетный модератор
9854 / 3753 / 171
Регистрация: 12.06.2008
Сообщений: 11,504
14.12.2016, 00:57 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот ваш же код, но немного изменённый.
1. Добавил проверку connect()
2. С select() у меня не получилось нормально работать... почему-то он принимал либо по сети, либо из консоли. Я с select() плохо знаком. Заменил на poll() - с ним всё без проблем.
3. Добавил цикл.

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
#include <errno.h>
#include <error.h>
#include <linux/socket.h>
#include <netinet/in.h>
#include <poll.h>
#include <stdio.h>
#include <strings.h>
#include <sys/select.h>
#include <sys/types.h>
#include <unistd.h>
 
int main()
{
    char sin[1024], sout[1024];
 
    int sd;
    struct sockaddr_in addr;
    char *host = "127.0.0.1";
    
    sd = socket(PF_INET, SOCK_STREAM, 0);
 
    if (sd < 0) {
        perror("socket");
    }
 
    bzero(&addr, sizeof(addr));
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8888);
    inet_aton(host, &addr.sin_addr);
    int* new_sock;
 
    if (connect(sd, (struct sockaddr *) &addr, sizeof(addr)))
        error(1, errno, "connect()");
 
    struct pollfd fds[2] = {
        { .fd = STDIN_FILENO, .events = POLLIN },
        { .fd = sd, .events = POLLIN }
    };
 
    while(1) {
        if (poll(fds, 2, -1) == -1)
            error(1, errno, "poll()");
 
        if (fds[1].revents) {
            int len = recv(sd, sout, sizeof(sout), 0);
            if (len == -1)
                error(1, errno, "recv()");
            else if (len == 0) {
                printf("Connection lost\n");
                break;
            } else {
                sout[len] = '\0';
                printf("Received '%s'\n", sout);
            }
        } else if (fds[0].revents) {
            fgets(sin, 1023, stdin);
            printf("Send message %s\n", sin);
            send(sd, sin, sizeof(sin), 0);
        }
    }
    close(sd);
}
Но если у вас текстовый протокол, то нет смысла передавать по 1024 байта. Можно вызывать send(sd, sin, strlen(sin), 0)
И имейте ввиду, что TCP - это потоковый протокол... два сообщения имеют право слиться в одно, а одно большое имеет право разорваться на два. По-хорошему надо иметь разделитель сообщений (например, символ перевода строки) и не выводить сообщение до тех пор, пока не будет получен этот символ. Т.е. должна быть возможность допринять сообщение.
1
MeriKh
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 8
24.12.2016, 21:50  [ТС] #10
Спасибо. Но у меня сейчас другая проблема.
Есть сервер и много клиентов. Клиенты отправляют серверу свои имена. Потом клиент может написать имя какого-нибудь клиента и сообщение. Сервер должен отправить это сообщение клиенту чей имя написал клиент. У сервера есть список клиентов, но я не могу найти клиента и отправить это письмо.
0
24.12.2016, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2016, 21:50
Привет! Вот еще темы с ответами:

POST не отправляет данные на сервер - jQuery
в консоли отображается пустая строка, и данные не отправляются на сервер Как это исправить? Я -- нуб в jquery, да и во всём в принципе ...

Как сервер отправляет ответ? - PHP
Зарание извиняюсь за глупый вопрос, но все же.Как сервер отправляет ответ клиенту если тот находится за NAT(ну тоесть имеет серый...

Сервер отправляет только 10 символов - Visual Basic .NET
Скажите! Есть такое ограничение чтоль? У меня сервер отправляет только 10 символов клиенту.

Приложение отправляет файл на сервер - C++ Builder
Приложение в котором выбирается файл и отправляется на сервер(в моём случае локальный). Аналогия была на PHP, как клиент использовал...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru