Помогоите с сокетами

Discussion in 'WASM.BEGINNERS' started by mChief, Jun 22, 2008.

  1. mChief

    mChief New Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2008
    Messages:
    9
    Пытаюсь написать простой чат на ассемблере с использованием сокетов. И никак немогу разобраться как лучше организовать работу с несколькими клиентами и как при этом отслеживать не отключился ли какой-то из клиентов. Если можно подскажите где можно найти примеры и литературу на эту тему.
     
  2. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    http://wasm.ru/article.php?article=socketbybeej
    http://wasm.ru/srclist.php?list=5
     
  3. mChief

    mChief New Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2008
    Messages:
    9
    Спасибо за ссылки, но там мало и я не нашел ответы на свои воросы.
     
  4. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    1 клиент = 1 поток/процесс
    по таймеру опрашивать клиентов.
     
  5. Aspire

    Aspire New Member

    Blog Posts:
    0
    Joined:
    May 19, 2007
    Messages:
    1,028
    mChief
    Смотри в сторону организации пула потоков. Каждый поток будет обрабатывать сообщения от одного клента в отдельном для каждого окне. Почитай Руссиновича про синхронизацию в многопоточных приложениях.
    Ща ссылку дам...
    Блин..то был Рихтер. Вот сцылки
    http://www.ebdb.ru/Search.aspx?p=1&s=создание+эффективных+приложений&x=0&y=0
     
  6. max7C4

    max7C4 New Member

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    Только я не понял зачем вам потоки. Есть функция WSAAsyncSelect (если есть окна, то оно) или select (если окна стряпать неохота)
     
  7. mChief

    mChief New Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2008
    Messages:
    9
    max7C4, а можна подробнее про WSAAsyncSelect? Как различать клиентов и узнавать от какого пришло сообщение?
    n0name, если создавать каждому клиенту свой поток, то как потом организовать между ними обмен сообщениями?
    з.ы. всем ответившим огромное спасибо:)
     
  8. calidus

    calidus Member

    Blog Posts:
    0
    Joined:
    Dec 27, 2005
    Messages:
    618
    =) Держи счастье твое ...
     
  9. SmikeX

    SmikeX New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2003
    Messages:
    20
    бесплатный консольный IRC бот-клиент с исходниками, но на С++

    http://ircdb.org/botik.htm
     
  10. mChief

    mChief New Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2008
    Messages:
    9
    calidus, спасибо, как раз то что я представлял, но мне неповерят что я его написал:) Тем более что я хочу сам разобраться
     
  11. Osen

    Osen Рие

    Blog Posts:
    0
    Joined:
    Apr 5, 2008
    Messages:
    283
    Location:
    Париж
    mChief
    Не смотри туда! Напиши сам! Тем более то, что тебе дали не по теме) Тебе n0name хорошо сказал, а jCronuzу надо побошке дать за тупые ссылки по сокетам. Литературы нет, тебе просто надо придумать свою архитектуру сетевых взаимодействий исходя из возможнотей socket api (или того api, что ты используешь). Ну или с###ить откуданить.

    Чат. Хорошо. У него есть адрес и порт. Туда коннектятся пользователи. Каждому коннекту соответствует сокет. При коннекте создается поток, который знает конкретного пользователя. Все пользователи срут и создается общий пул сообщений, который отсылается каждому из клиентов с некоторым периодом. Если сокет отвалился, значит и пользователя больше нет. Если отослать в период ему не получилось, то можно чуть позже отослать еще раз и потом сделать вывод, что он отвалился. Помимо потоков клиентов, есть поток который следит за пользователями и за всеми сообщениями.
     
  12. calidus

    calidus Member

    Blog Posts:
    0
    Joined:
    Dec 27, 2005
    Messages:
    618
    Osen
    вот возьми и напиши пример классный ему , а пока это тупо рассуждения , коды давай а потом уже советуй без советов абстрактно все мастера говорить. 8)
     
  13. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    плохо
    опять плохо

    высокопроизводительные сетевые приложения используют неблокирующие сокеты и мультиплексирование I/O (select(), poll(), epoll(), ...)
     
  14. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    rei3er
    Где речь шла о производительности? Вот о простоте было. И самое простое - это как раз блокирующие сокеты с recv в цикле в отдельном потоке на каждого клиента. А опрашивание по таймеру - это не то, что плохо, просто необходимости нету: recv в случае разрыва соединения просто вынесет с нулем или с ошибкой.
     
  15. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    ну как бы чат подразумевает быть производительным
    или он пишется для двух человек? ;)
     
  16. calidus

    calidus Member

    Blog Posts:
    0
    Joined:
    Dec 27, 2005
    Messages:
    618
    =) гггг уже речь до производительности зашла )))))))) Все мировые программы написаны на асинхронных сокетах. В чем производительность то блокирующих и не блокирующих ))))) ????!!!!!! Все зависит от того как напишешь функции , на асме пиши и будет тебе производительность ))))))))
     
  17. mChief

    mChief New Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2008
    Messages:
    9
    Чат должен быть простенький, не больше 10 клиентов, поэтому можно было бы и поток для каждого создавать, но я решил попробовать с неблокирующими сокетами.
    А как быть с длинной сообщений? Сделать ее фиксированной?
     
  18. 2FED

    2FED New Member

    Blog Posts:
    0
    Joined:
    Feb 20, 2008
    Messages:
    1,002
    calidus можно и на асме написать так что тормозить всё будет, а производительность в том что нет кучи потоков и на них не рассходуются ресурсы. Прикинь например сервер IRC на блокирующих сокетах :lol:
     
  19. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    если операция I/O на сокете не может быть выполнена, то может быть выполнено другое действие или операция I/O на другом сокете
    при хорошей реализации конечного автомата производительность будет максимальной
    на MP системе целесообразно запустить по _одному_ потоку на каждом CPU
    каждый поток реализует один и тот же конечный автомат
    синхронизация по возможности тоже должна быть неблокирующей (например, на атомарных операциях)
    во всех случаях, когда время ожидания при блокировке превышает время выполнения хотя бы одного полезного действия, нужно отказываться от блокирования

    что касается асинхронных операций, то они будут менее эффективны засчет накладных расходов на генерацию сигнала (или любого другого способа нотификации)
     
  20. calidus

    calidus Member

    Blog Posts:
    0
    Joined:
    Dec 27, 2005
    Messages:
    618
    rei3er
    дык я про что и говорю =) сравните при лучших реализациях оба варианта , и врядли вы существенно выйграете в скорости ...