Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2014, 17:04   #1
bypus12
Новичок
Джуниор
 
Регистрация: 04.06.2014
Сообщений: 1
По умолчанию Не отправляет сообщение клиентам

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

Код сервера:

Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
 
using namespace std;
 
int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
	int socks[16];
    int bytes_read;
 
    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    fcntl(listener, F_SETFL, O_NONBLOCK);
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1212);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }
 
    listen(listener, 2);
    
    set<int> clients;
    clients.clear();
 
    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);
 
        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(*it, &readset);
 
        // Задаём таймаут
//        timeval timeout;
//        timeout.tv_sec = 15;
//        timeout.tv_usec = 0;
 
        // Ждём события в одном из сокетов
        int mx = max(listener, *max_element(clients.begin(), clients.end()));
        if(select(mx+1, &readset, NULL, NULL, 0) <= 0) //  if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }
        
        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }
			printf("Socket ID: %d\n", sock);
            
            fcntl(sock, F_SETFL, O_NONBLOCK);
            clients.insert(sock);
			printf("Insert ID: %d\n", sock);
        }
 
        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(*it, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(*it, buf, 1024, 0);
 
                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(*it);
                    clients.erase(*it);
					printf(buf);
                    continue;
                }
				
				printf("Получено %d bytes\tСообщение: %s\n", bytes_read, buf);
				printf("Отправляю принятое сообщение клиенту %d\n", *it);
 
                // Отправляем данные обратно клиенту
				send(*it, buf, bytes_read, 0);
				printf("Send msg ID: %d\n", *it);
            }
        }
    }
    
    return 0;
}
И код клиента:
Код:
			char buf[265];
			int bytes_read;
			memset(buf, 0, 256);

			while (1)
			{
				bytes_read = recv(ss, buf, sizeof(buf), 0);
				if (bytes_read <= 0) break;
				String ^blya = gcnew System::String(buf);
				blya = blya->Concat("Сообщение: ", blya);
				
				listBox2->Items->Add(blya);
			}
В чём может быть проблема?

Последний раз редактировалось Stilet; 04.06.2014 в 17:17.
bypus12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос создания отчетов по клиентам из одного отчета Даниил Лайков Microsoft Office Excel 5 16.05.2013 19:45
Отправка данных клиентам в Delphi Максим139 Помощь студентам 0 23.04.2011 10:20
Как отправить сообщение определенным клиентам? TServerSocket S1nt3z Работа с сетью в Delphi 7 29.01.2011 22:30
Не отправляет сообщения Mihanches Работа с сетью в Delphi 0 18.10.2010 17:18
Отправка сообщения от сервера всем клиентам Cold_Night Работа с сетью в Delphi 2 25.05.2009 21:50