Одесса: 7°С (вода 9°С)
Киев: 1°С
Львов: -1°С

Тема: Основные вопросы по сокетам

Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 20 из 38
  1. Вверх #1

    По умолчанию Основные вопросы по сокетам

    Расскажите, как пользоваться функциями accept(), recv() ну и т. п., которые _опрашивают_ порт. Ведь, по идее, они выполняются ну не совсем мгновенно. Это я про аццепт.
    Теперь к рецву: нужно организовать параллельный процесс с постояным опросом, или просто эта функция вызывается сама, как событие (как я понял из примеров: в одном, весьма распостранённом, где SockListener & SockComander, помните? так вот, там я вообще не нашёл _вызова_ вышеупомянутых ф-ций. Только в объявлениях.)
    И это меня, мягко говоря, терзает.
    Помогите, добрые люди. А ещё лучше - если бы кто согласился поговорить по мылу.


  2. Вверх #2
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Что то вопрос не совсем внятно сформулирован. Что значит: "не совсем мгновено"? Смотря какой сокет. Если BLOCKED то выполнение приостанавливается до тех пор, пока функция не вернет результат, если же NON_BLOCKED, то функция возвращает управление сразу же.

    Опять, же, под какую ось пишешь?
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  3. Вверх #3
    Да не важно, под какую ОС. Я пока изучаю и юниксовые сокеты, и МФЦшные классы.
    Слышал что-то подобное тому, что Вы сказали. Только вот сразу возникают доп. вопросы:
    Намбер раз: где надо указывать, БЛОКЕД/НОНБЛОКЕД?
    Намбер два: предположим, неблокирующий сокет. Тогда каким_образом мне потом получить результат опроса порта на предмет наличия ждущих в очереди клиентов?
    Просто опишу вкратце один юниксовый пример:
    Сервер:
    Бинденье порта;
    Вход в цикл while(true);
    {//тут как бы тело цикла...
    создание экземпляра класса для обслуживания клиента;
    аццептим вышеописанный экземпляр;
    //ну и дальше обмен данными...
    }//Ну а тут конец тела цикла; тело повторяется до бесконечности.
    Вот. И всё так просто и складно...

    Ну и вообще обычно все, кому не лень, сначала намутят по паре наследуемых классов, я понимаю, это автоматизирует процесс, правильно, даже необходимо, но я ещё ни разу не нашёл такого примера, где бы всё велось напрямую хотя бы через класс CSocket (MFC) или через стандартные функции. Это могло бы объяснить начинающим, что именно делают функции и что именно от них следует ожидать.
    Dixi.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  4. Вверх #4
    Намбер раз - насколько я помню, сокет создается BLOCKED. Включить NONBLOCKED - с пом. IOCTL - FIONBIO (1)
    Не будите во мне Зверя, он и так не высыпается

  5. Вверх #5
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Цитата Сообщение от Tigra
    Намбер раз - насколько я помню, сокет создается BLOCKED.
    факт.

    Цитата Сообщение от Tigra
    Включить NONBLOCKED - с пом. IOCTL - FIONBIO (1)
    в винде да. в линухе через fcntl( NON_BLOCK)
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  6. Вверх #6
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Намбер два: читаем доку, в которой пишется что если recv() неблокирующий, то результат выполнения >0 - если были данные, 0 - если сокет закрыт другой стороной и в случае если результат <0 то надо смотреть WSAGetLastError() что бы она была WSAWOULDBLOCK (под линухом смотрим errno на предмет E_AGAIN кажись).
    Так же внимательно знакомимся с функцией select().

    P.S. что это Вы читаете, совсем непонятно. Попробуйте мсдн в случае с виндой и ман в случае с линухом. И примеры там есть использования сокетов без классов.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  7. Вверх #7
    ЮЮ P.S. что это Вы читаете, совсем непонятно. Попробуйте мсдн в случае с виндой и ман в случае с линухом. И примеры там есть использования сокетов без классов.

    Да что нашёл в нете - то и читаю, хотя понимаю, что мало рылся (всего раза 4 в поисковиках прошмыгал первые пять страниц).
    MSDN - скачивал с фтпы. Но там какие-то странные файлы с незнакомым расширением. Я не знаю, что мне с ними делать, хоть не ламер.
    А что, есть маны на сипипишные функции?!

    ЮЮ Включить NONBLOCKED - с пом. IOCTL - FIONBIO (1)

    в винде да. в линухе через fcntl( NON_BLOCK)

    Вот про такие функции много слышал (в ФакЮ, в разговроах "...а как сделать..."), но где бы о них побольше почитать?

    Буду очень благодарен за ссылки.
    Готов помочь в ответ, чем смогу (хоть сомневаюсь, что кому-то надо).
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  8. Вверх #8
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    хм. маны. http://www.rt.com/man/
    мсдн: msdn.microsoft.com

    По виндовым сокетам сюда: http://msdn.microsoft.com/library/en...art_page_2.asp

    по *ховым сюда http://www.unixguide.net/network/socketfaq/
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  9. Вверх #9
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    вот еще по виндовым http://tangentsoft.net/wskfaq/
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  10. Вверх #10
    Посетитель Аватар для Rett Pop
    Пол
    Мужской
    Адрес
    Odessa
    Возраст
    41
    Сообщений
    246
    Репутация
    37

    По умолчанию Re: Основные вопросы по сокетам

    Цитата Сообщение от krieger
    Расскажите, как пользоваться функциями accept(), recv() ну и т. п., которые _опрашивают_ порт. Ведь, по идее, они выполняются ну не совсем мгновенно. Это я про аццепт.

    Помогите, добрые люди. А ещё лучше - если бы кто согласился поговорить по мылу.
    Залезь на www.citforum.ru и поищи статейку "Самоучитель игры на WINSOCK". Многое прояснится.
    WBR, Rett Pop

  11. Вверх #11
    >>Залезь на www.citforum.ru и поищи статейку "Самоучитель игры на WINSOCK". Многое прояснится.

    А вот за это спасибо, таки очень прояснилось! Хотя подобные примеры уже встречал под линь.
    НО в нём вот какой трабл: если шлёшь больше 15 символов, то тебе возвращаются только первые 15. Будем решать.

    Ещё вопрос: можно ли вместо тредов для каждого клиента поставить один, который бы ловил мессаги от всех клиентов?

    Каждому от меня персональная благодарность за помощь начинающему программисту.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  12. Вверх #12
    Да, и ещё: не удаётся компилировать проект в режиме Релиз
    Ой-не, уже всё пучком.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  13. Вверх #13
    А теперь подробнее.
    Вызываю функцию setsockopt(...)
    Прототип:
    int setsockopt (SOCKET s, int level, int optname, const char FAR * optval, int optlen)
    Левл - SOL_SOCKET.
    Опция - SO_RCVBUF/SO_SNDBUF.
    А что писать в optval ?!

    ЮЮ Ещё вопрос: можно ли вместо тредов для каждого клиента поставить один, который бы ловил мессаги от всех клиентов?
    (имеется в виду - при тср.)
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  14. Вверх #14
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Идем http://msdn.microsoft.com/library/de...tsockopt_2.asp и внимательно читаем, разглядывая картинки в виде примеров ;-) И увидишь что для SO_RCVBUF/SO_SNDBUF туда надо передать новый размер буфера, то есть создаешь переменную типа int, заносишь в неё новое значение и передаешь указатель функции.

    Вместо тредов поставить один можно. Никто сему не мешает.
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  15. Вверх #15
    Цитата Сообщение от Slaventius
    Идем http://msdn.microsoft.com/library/de...tsockopt_2.asp и внимательно читаем, разглядывая картинки в виде примеров ;-)
    Ага... Только если бы он ещё захотел тебе сходу дать эту пагу...
    Он показывает пагу http://msdn.microsoft.com/library/sh...treeconfig.xml
    Нео>Веди меня!
    В смысле, как там найти, в каком разделе, эту пагу?


    Цитата Сообщение от Slaventius
    И увидишь что для SO_RCVBUF/SO_SNDBUF туда надо передать новый размер буфера, то есть создаешь переменную типа int, заносишь в неё новое значение и передаешь указатель функции.
    А теперь... Ещё раз внимательно смотрим на прототип...
    И понимаем, что там нету параметра типа инт!!!

    Цитата Сообщение от Slaventius
    Вместо тредов поставить один можно. Никто сему не мешает.
    И вызывать sendto и recvfrom?
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  16. Вверх #16
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Цитата Сообщение от krieger
    Ага... Только если бы он ещё захотел тебе сходу дать эту пагу... Он показывает пагу http://msdn.microsoft.com/library/sh...treeconfig.xml
    Нео>Веди меня!
    В смысле, как там найти, в каком разделе, эту пагу?
    При непопадании на ссылку меняем провайдера, браузер, прокси (нужное подчеркнуть). Если нет возможности попаcть напрямую идем, как все нормальные герои на www.google.com и в строке поиска набираем setsockopt msdn и по первой же ссылке выходим куда надо.

    Цитата Сообщение от krieger
    А теперь... Ещё раз внимательно смотрим на прототип...
    И понимаем, что там нету параметра типа инт!!!
    Нету конечно. Зато есть char*. Кто ж вам, родной мой, мешает написать
    Код:
    &#40;char*&#41;&i
    , ась?

    Цитата Сообщение от krieger
    И вызывать sendto и recvfrom?
    А при чем здесь udp? Читаем про уже ранее упоминавшуюся функцию select() (а под виндой еще и про WSASelectEvent()), потом еще раз про асинхроные сокеты. Много думаем :wink: [/b]
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  17. Вверх #17
    Цитата Сообщение от Slaventius
    Цитата Сообщение от krieger
    Ага... Только если бы он ещё захотел тебе сходу дать эту пагу... Он показывает пагу http://msdn.microsoft.com/library/sh...treeconfig.xml
    Нео>Веди меня!
    В смысле, как там найти, в каком разделе, эту пагу?
    При непопадании на ссылку меняем провайдера, браузер, прокси (нужное подчеркнуть). Если нет возможности попаcть напрямую идем, как все нормальные герои на www.google.com и в строке поиска набираем setsockopt msdn и по первой же ссылке выходим куда надо.
    Да нет, я думаю, что сервак мсдна проверяет http-referer и смотрит: если пришёл чел с предыдущего раздела иль с оглавления - пускать. Иначе - на оглавление.

    Цитата Сообщение от Slaventius
    Цитата Сообщение от krieger
    А теперь... Ещё раз внимательно смотрим на прототип...
    И понимаем, что там нету параметра типа инт!!!
    Нету конечно. Зато есть char*. Кто ж вам, родной мой, мешает написать
    Код:
    &#40;char*&#41;&i
    , ась?
    Дык меня просто немного смутил такой... оригинальный подход к решению прототипов. Могли уж написать - void*... Хоть немного понятней, чего от тебя ждут. Я уже давно понял, что там работают извращенцы, но такого ещё просто не видел. До меня, извините, не дошло, как это понимать. Спасибо.

    Цитата Сообщение от Slaventius
    Цитата Сообщение от krieger
    И вызывать sendto и recvfrom?
    А при чем здесь udp? Читаем про уже ранее упоминавшуюся функцию select() (а под виндой еще и про WSASelectEvent()), потом еще раз про асинхроные сокеты. Много думаем :wink: [/b]
    [/quote]
    Эээ...
    Я.Ру
    Результат поиска: страниц — 0
    Статистика слов: WSASelectEvent — 0
    Запросов за месяц: wsaselectevent — 0
    Искомая комбинация слов нигде не встречается
    «WSASelectEvent»
    Гугль находит только англицкие да и там ничего не понятно.

    За селект - лучше подскажите, где искать, чтоб мне не морочить голову - уж слишком это слово общее...

    Да ни при чём удп! А вот чего ты о нём вспомнил, мне странно!
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  18. Вверх #18
    А! Уже залез через гугль на нужную страницу. Спасибо!
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]

  19. Вверх #19
    Посетитель
    Пол
    Мужской
    Адрес
    Odessa
    Сообщений
    496
    Репутация
    13
    Цитата Сообщение от krieger
    Да нет, я думаю, что сервак мсдна проверяет http-referer и смотрит: если пришёл чел с предыдущего раздела иль с оглавления - пускать. Иначе - на оглавление.
    Да ну. Чепуха. Можем конечно устроить опрос попадаете ли вы по ссылке, но я все же думаю что ничего подобного не проверяется. Меняйте в своей консерватории.

    Цитата Сообщение от krieger
    Дык меня просто немного смутил такой... оригинальный подход к решению прототипов. Могли уж написать - void*... Хоть немного понятней, чего от тебя ждут. Я уже давно понял, что там работают извращенцы, но такого ещё просто не видел.
    Ничего особо извращеного в том что бы передавать буфер как char* не вижу. Ведь int это частный случай.

    Цитата Сообщение от krieger
    А при чем здесь udp?
    Да потому что recvfrom() и sendto() используются в основном для udp, так как они работают с сокетами которые не находятся в состоянии коннекта.
    Можно и с tcp сокетами, но я не разу не видел таких реализаций.

    Цитата Сообщение от krieger
    Эээ...
    Я.Ру
    Результат поиска: страниц — 0
    Статистика слов: WSASelectEvent — 0
    Запросов за месяц: wsaselectevent — 0
    Искомая комбинация слов нигде не встречается
    «WSASelectEvent»
    Гугль находит только англицкие да и там ничего не понятно.

    За селект - лучше подскажите, где искать, чтоб мне не морочить голову - уж слишком это слово общее...
    С английским проблемы? Эт зря. Поправляй.

    что касается select() то вот неплохой пример http://www.lowtek.com/sockets/select.html
    Думаешь ли ты о жизни? Думаешь ли ты о смерти? Что ты будешь делать когда поймешь что никому не нужен?

  20. Вверх #20
    Цитата Сообщение от Slaventius
    Да ну. Чепуха. Можем конечно устроить опрос попадаете ли вы по ссылке, но я все же думаю что ничего подобного не проверяется. Меняйте в своей консерватории.
    Нет, я понял, ты мне просто ссылку корявую дал: на самом деле это
    http://msdn.microsoft.com/library/en...tsockopt_2.asp
    сравни.

    Цитата Сообщение от Slaventius
    Ничего особо извращеного в том что бы передавать буфер как char* не вижу. Ведь int это частный случай.
    Ну так и поставили бы void*!


    Цитата Сообщение от Slaventius
    Да потому что recvfrom() и sendto() используются в основном для udp, так как они работают с сокетами которые не находятся в состоянии коннекта.
    Можно и с tcp сокетами, но я не разу не видел таких реализаций.
    Я тоже ак думаю. Короче, надо как-нибудь попробовать.

    Цитата Сообщение от Slaventius
    С английским проблемы? Эт зря. Поправляй.
    Да проблем нет, но иногда такие доки попадаются, что просто мозги плавятся просто так, причём там чушь несусветная. А в русских доках хоть что-то понятно. Тема, согласитесь, требует максимума внимания при изучении...
    Тот факъю по винсокетам на англицком - просто прелесть, ОЧЕНЬ ХОЧУ НА БУМАГЕ!!!


    Ребята, подмогните с проблемой: в том примере Касперского сервер принимает только 16 байт мессаг, и при посылке больше 15 символов(без CR) возвращаются всё равно только начало
    Хотя глянул рцвбуф - исправные 8192 байт
    Встаёт исконно русский вопрос
    Если надо - приведу код.
    [url=www.warsword.od.ua][code]IC | XC
    ---+---
    NI | KA
    [/code][/url]


Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения