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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 18:38   #1
Mixas
Новичок
Джуниор
 
Регистрация: 07.06.2007
Сообщений: 2
По умолчанию Создание нескольких прослушивающих сокетов (Linux)

Доброго времени суток!

Пишу под Linux на С++ приложение которому необходимо иметь два слушающих сокета на разных портах.

Собственно код:

Код:
	int clientListener,serverListener;
    struct sockaddr_in addr,addr2;
    
	//Создаем сокет
    clientListener = socket(AF_INET, SOCK_STREAM, 0);
    if(clientListener < 0)
    {
        perror("Socket client");
    }
	serverListener = socket(AF_INET, SOCK_STREAM, 0);
	if(serverListener < 0)
    {
        perror("Socket server");
    }
    
	//Включаем неблокирующий режим
    fcntl(clientListener, F_SETFL, O_NONBLOCK);
	fcntl(serverListener, F_SETFL, O_NONBLOCK);
    
	//Включаем прослушку сокета
    addr.sin_family = AF_INET;
	addr.sin_port = htons(clientPort);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(clientListener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("Bind client socket");
    }
	addr2.sin_family = AF_INET;
	addr2.sin_port = htons(serverPort);
    addr2.sin_addr.s_addr = htonl(INADDR_ANY);
	if(bind(serverListener, (struct sockaddr *)&addr2, sizeof(addr2)) < 0)
    {
        perror("Bind server socket");
    }
При выполнии, функция
Код:
bind(serverListener, (struct sockaddr *)&addr2, sizeof(addr2)
возвращяет отрицательное значение, и генерируется ошибка "Address already in use"

Я предполагаю, что это из-за addr.sin_addr.s_addr = htonl(INADDR_ANY); и addr2.sin_addr.s_addr = htonl(INADDR_ANY); Но разве нельзя создать два слушающих сокета на разных портах и одном сетевом интерфейсе?

Проблема мне не понятна, прошу более опытных программистов помочь советом.
Mixas вне форума Ответить с цитированием
Старый 24.12.2011, 19:16   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

setsockopt + SO_REUSEADDR
counter вне форума Ответить с цитированием
Старый 18.01.2012, 19:56   #3
Mixas
Новичок
Джуниор
 
Регистрация: 07.06.2007
Сообщений: 2
По умолчанию

Спасибо за совет. Конструкция,
Код:
const int on = 1;
setsockopt(clientListener,SOL_SOCKET,SO_REUSEADDR, &on, sizeof(on);
setsockopt(serverListener,SOL_SOCKET,SO_REUSEADDR, &on, sizeof(on);
вставленная в код до включения неблокирующего режима, решила проблему.
Mixas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нескольких потоков iKarma Общие вопросы Delphi 9 20.10.2011 18:11
Создание нескольких форм Лера123 Общие вопросы Delphi 4 16.10.2010 18:16
Delphi Создание приложения на основе сокетов Fortismine Работа с сетью в Delphi 1 14.05.2010 13:33
Создание нескольких форм в одной Лукманов Александр Общие вопросы Delphi 1 11.04.2009 13:08
Создание списка из нескольких ячеек DragonTM Microsoft Office Excel 6 30.10.2008 15:46