WinSock Api

Тема в разделе "WASM.WIN32", создана пользователем AntiB, 24 июл 2007.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Доброе время суток, у меня небольшой вопрос, незнаю или в тему, но я пишу прогу на Дельфи:
    У меня есть, например, 5 потоков и главное окно. Мне нужна зделать следущие:
    Конектиться клиент, главное окно выберает куда кинуть етого клиента(тоесть в какой поток), потом етот поток должен заботиться о сокете клиента, тоесть определять - пришли даные или закрылось сойденения.
    Всё почти зделал, первою часть я зделал с помощу WSAAsyncSelect - так как у меня есть главное окно, но у потоков нету окон - поетому нарыл в иНете такие функции как WSACreateEvent, WSAEventSelect, WSAWaitForMultipleEvents и другие - я узнал что последняя функция (WSAWaitForMultipleEvents) может обробатывать тока 64 сойденений - мне нужна больше. Поетому незнаю как мне зделать вторую часть задачи: поток должен обробатывать события в потоках(fd_read, fd_close). МОЖЕТ КТОТО ЗНАЕТ КАК ВСЁ ЕТО ЗДЕЛАТЬ? ЗАРАНИЕ БЛАГОДАРЕН
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    А зачем ты так делаешь? Имхо, проще сделать accept и ждать входящее соединение. Когда оно поступит, создай тред и передай ему в качестве параметра хендл сокета. Или такое тебе не подходит?
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Если делать за твоим вариантом, то тогда нада создавать поток каждому клиенту, чтобы зделать "асинхронный" режим работы, иначе просто приложения зависнет до поступлении даных или ожыдания конекта. Но мне етот вариант неподходит, мне именно нужно чтобы были уже потоки и главное окно выберало куда кидать клиента и потом уже сам поток обрабатывал всё действия в сокете
     
  4. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    ищо я нашел функцию Select -может нада ео использовать?
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Да, надо.

    http://sysoev.ru/prog/links.html
    Первые две ссылки.

    Советую ещё почтать Стивенса, Разработка сетевых приложений.
     
  6. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    nester7
    Спасибо большое, немного понял, а есть похожое только на русском? а то с англ неочень и ищо мне нужна для Винды, а не для unix-оподобных. Зарание благодарен
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Ищо один небольшой вопрос, скока приблизительно максимально можна создать потоков, на Системе: Windows и количество памяти: 4ГБ ???
     
  8. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    1. На русском есть. Ищи или сходи в книжный.
    2. Тебе хввтит, чтобы обработать много тысяч соединений :)
    Конечно же, при "правильной" архитектуре.



    вот тут, кстати, кажется есть http://all-ebooks.com/
     
  9. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    nester7
    Ето скока? Больше 2000, 5000, 10000 ? Чисто интересно :)
     
  10. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    Теоретически количество свободных портов на компе минус 1 порт под прослушку заказов на коннект.
     
  11. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Я зделал маленькую программку которая считает количество возможных потоков, оказалось около 2000, но поискав в иНете я нашел статтью где говориться что уменшыв стек - увеличиваеться уоличество создания потоков, попробывал - работает, но тепер интересный вопрос - Как узнать скока стека нужно программе? (по стандарту стоит 1 МБ, я поставил в тест-программе 64 КБ и смог создать 30 312 потоков =) )
     
  12. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    уменшь еще попалам и почти упрешся в потолок. как ты уменьшил размер поточного стека?
     
  13. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    CodeTao
    тоесть стек нужен тока на 32 КБ ? (приблизительно)
    Project -> Options -> Linker
    там увидеш раздел об стеке
     
  14. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    Смотря скока тебе надо, я выходил из простой ариметике 1024/64=16 раз; 2000 потоков умножить на 16 будет 32000(~30320) , следственно разделив размер стека на 2 увеличим количество потоков дважды:)
    Тока вроде бы размер стека указываются через парамерты CreateTread.
     
  15. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    На сколько я знаю на rambler.ru nginx держит легко 200.000 соединений.
     
  16. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    nester7
    Интересно как такое зделать, или там железо офигенное, или они всё делают как то по другому, просто когда я создал ети 30312 потоков - ушло очень много оперативки. Может знаеш как держать 200 000 соединений ?
     
  17. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    CodeTao
    Тогда легко можна розчитать скока нужна стека поставить чтобы создать стока потоков, сойдинений - но нельзя очень сильно урезать стек, так как в ньом много что может храниться, поетому хочу узнать - как можна вычесли - на скока можна урезать стек?
     
  18. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    AntiB
    Наверное экспериментально. Урезай пока не пойдут stack overflows
     
  19. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Этот параметр для только для стека основного потока. Хотя если при вызове функции CreateThread размер стека указать как 0, то значение берется как раз из поля PE-файла.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Одним потоком через select.