Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше организовать много-поточный сервер 
:(
    Опции темы
io2me
Дата 15.3.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.3.2006
Где: .NET

Репутация: нет
Всего: нет



Здраствуйте. Вот хотел спросить сабж.
Помоему есть 2 варианта:
1. Запустить N потоков, каждый ждет поключения (помоему что попало)
2. Запустить цыкл while, ожидающий подключения, и если ктото коннектиться обрабатывать его в потоки, чтобы сразу ждать других коннектов.

Что скажете ? Как лучше ?
PM MAIL   Вверх
adonin
Дата 16.3.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 1
Всего: 5



Лучше так:

в основном потоке делаете listen(), затем accept(). accept() возвратит вам описатель нового сокета, через который вы можете общаться с данным клиентом.
После этого создаёте новый поток для работы через данный сокет. а в основном потоке опять делаете listen(). и accept().
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
io2me
Дата 16.3.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.3.2006
Где: .NET

Репутация: нет
Всего: нет



можно пример ?
PM MAIL   Вверх
adonin
Дата 16.3.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 1
Всего: 5



Код

#include <conio.h>
#include <stdio.h>
#include <winsock2.h>

#pragma comment (lib, "ws2_32.lib")
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001

char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;

DWORD WINAPI ThreadProc(
  LPVOID lpParameter   // thread data
)
{

    SOCKET S=(SOCKET)lpParameter; 
    // Работа с клиентом
    // recv(S,...);
    // send(S,...);
    // и т.д.

    return 1;
}
void main()
{
  WSADATA     wsadata; 
  SOCKET      s;  
  char        name[128]; 
  HOSTENT*    phe;       
  SOCKADDR_IN sa;        
  IN_ADDR sa1;        
  unsigned long        flag = 1;  

  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  gethostname(name, sizeof(name));
  phe = gethostbyname( name );
  ZeroMemory( &sa, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));

  SOCKADDR SIN;
  SOCKET S2;

  while(1)
  {
    DWORD TreadId;
    listen(s,10); // 10 - количество возможных соединений
    int i=sizeof(SIN);
    S2=accept(s,&SIN,&i);

    CreateThread(NULL,0,ThreadProc,(PVOID)S2,0,&TreadId);
  }
  closesocket( s );
  WSACleanup();
}



Примерно так. smile
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
io2me
Дата 16.3.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.3.2006
Где: .NET

Репутация: нет
Всего: нет



спасиб, идея понятна.. а можна без win32 ?
а то я буду на linux переводить !
PM MAIL   Вверх
adonin
Дата 16.3.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 1
Всего: 5



Не-а smile
Спроси в форуме "Программирование под linux". Но принцип тот же. Особо переделывать не придётся.
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
io2me
Дата 16.3.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.3.2006
Где: .NET

Репутация: нет
Всего: нет



да в том форуме все молчат )))
маздаевцы smile
PM MAIL   Вверх
YanTsys
Дата 23.3.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Как я понимаю после открытия сокет активен пока его принудительно не закрыть...
А нет нигде параметра позволяющего сокету автоматически закрываться в случае если оборвана связь?
Или нужно по таймеру делать опрос всех открытых сокетов на живность?
PM MAIL ICQ   Вверх
Kill_em_all
Дата 29.3.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 2.4.2005

Репутация: нет
Всего: нет



А с помощью асинхронных сокетов?
Еще лучший вариант! Забудьте про использование
потоков для такой цели
PM MAIL   Вверх
adonin
Дата 29.3.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 1
Всего: 5



Цитата(Kill_em_all @ 29.3.2006, 11:52 Найти цитируемый пост)
А с помощью асинхронных сокетов?

Так делать не хорошо: клиенты будут обслуживаться по очереди!!! им придётся ждать, если нагрузка на сервер будет значительной. И потом, если у вас многопроцессорная система, Вы получите значительный выигрыш в скорости, если будете использовать потоки.

Цитата(YanTsys @ 23.3.2006, 01:54 Найти цитируемый пост)
А нет нигде параметра позволяющего сокету автоматически закрываться в случае если оборвана связь?
Или нужно по таймеру делать опрос всех открытых сокетов на живность?

Жаль, нет под рукой MSDN. Скорее всего, уровень TCP скажет вам о разрыве соединения (recv не получит данные, а GetLastError возвратит ошибку!=0). Но, возможно и нет. Легче всего проверить на двух машинах: выдернуть сетевой кабель из клиента, когда сервер будет ожидать запрос.
Посмотрите функцию SetSockOpt() возможно там что-нибудь будет: что-то типа SO_KEEP_ALIVE

--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
LuckLess
Дата 29.3.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Цитата(adonin @ 16.3.2006, 12:18 Найти цитируемый пост)
а в основном потоке опять делаете listen(). и accept().

listen опять не надо

Цитата(Kill_em_all @ 29.3.2006, 11:52 Найти цитируемый пост)
А с помощью асинхронных сокетов?
Еще лучший вариант! Забудьте про использование
потоков для такой цели

Цитата(adonin @ 29.3.2006, 13:26 Найти цитируемый пост)
Так делать не хорошо: клиенты будут обслуживаться по очереди!!! им придётся ждать, если нагрузка на сервер будет значительной. И потом, если у вас многопроцессорная система, Вы получите значительный выигрыш в скорости, если будете использовать потоки.

клиентам в любом случае придеться ждать. и к томуже 1 процесс может создать всего около 1300 потоков(в винде)
лучший вариант - комбинированный - асинхронные сокеты + потоки.
но не знаю как его реализовать под nix системы.
PM MAIL   Вверх
Romikgy
Дата 29.3.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Имхо в
Цитата(LuckLess @ 29.3.2006, 12:45 Найти цитируемый пост)
nix

нет потоков

Цитата(LuckLess @ 29.3.2006, 12:45 Найти цитируемый пост)
listen опять не надо

имхо надо , т.к. аксепт сьедает под себя сокет, а при создании нового ему снова надо говорит "слушай"


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
LuckLess
Дата 29.3.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Цитата(Romikgy @ 29.3.2006, 14:28 Найти цитируемый пост)
имхо надо , т.к. аксепт сьедает под себя сокет, а при создании нового ему снова надо говорит "слушай"

Не надо .
Листен лишь говорит какова максимальная очередь ожидающих соединения и все.
Добавлено @ 16:12
Цитата(Romikgy @ 29.3.2006, 14:28 Найти цитируемый пост)
нет потоков

Ну наверняка чтото похожее естьsmile
Добавлено @ 16:12
не fork()-иться же каждый раз..

Это сообщение отредактировал(а) LuckLess - 29.3.2006, 16:13
PM MAIL   Вверх
Бонифаций
Дата 29.3.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



Цитата(Romikgy @ 29.3.2006, 14:28 Найти цитируемый пост)
Имхо в
Цитата(LuckLess @ 29.3.2006, 12:45 Найти цитируемый пост)
nix

нет потоков


Есть. Куда же они денутся. mysql к примеру многопоточный сервер, oops прокси, firebird-ss.


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Romikgy
Дата 29.3.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(LuckLess @ 29.3.2006, 15:11 Найти цитируемый пост)
Не надо .
Листен лишь говорит какова максимальная очередь ожидающих соединения и все.

точно не надо аксепт создает новый сокет

Цитата(LuckLess @ 29.3.2006, 15:11 Найти цитируемый пост)
Ну наверняка чтото похожее есть

есть эт точно smile но что я не в курсе



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.