Socket error 10038 (WSAENOTSOCK)

Тема в разделе "WASM.NETWORKS", создана пользователем ECk, 7 фев 2007.

  1. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Добрый день всем!
    Мистика какая-то творится. При вызове socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) получаю INVALID_SOCKET и GetLastError = 10038 (WSAENOTSOCK, чего быть не может в принципе по определению, т.к. объект "сокет" только создается).

    Предыстория такая:
    1. Основной код тулзы на асме
    2. Доп. либа сишная, скомпиленная в VS6
    3. Мистика случается в дополнительном потоке, создаваемом тулзой, в коде сишной либы.

    Причем, что интересно:
    1. Вызываю socket с теми же параметрами в коде тулзы - все ОК, стоит сразу после этого сделать call в сишную либу и вызвать socket с теми же параметрами там - INVALID_SOCKET.
    2. Трассировал падающий вызов, спотыкается уже где-то на этапе обращения к AFD, внутри mswsock (получает 80000002 - STATUS_DATATYPE_MISALIGNMENT), затем устанавливает LastError в 10022 (2726h - invalid parameter, кажется), а на выходе устанавливает 10038.

    Не сталкивался ли кто с такой мистикой? Как решать, не знаю уже.
     
  2. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Это не мистика, а ошибка "socket operation on nonsocket". Юзай критические секции/interlocked-функции
     
  3. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    riban
    Я знаю, что такое WSAENOTSOCK - но в MSDN такого статуса (вменяемого) для функции socket нет.
    Критические секции здесь не при чем (читай п.3 предыстории - там в дополнительном потоке это происходит и в коде статической либы, тогда как в основном коде тулзы создаются по 300-500 потоков и параллельно нормально работают каждый со своим сокетом).
     
  4. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    ECk
    Про потоки в основной тулзе ты ничего не писал.
    Дык может либа кривая? Архитектура не та или ещё чего? У меня так было пару раз - 2е суток потерял:)
     
  5. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Мегажесть :) - оказывается стек, не выровненный на 4 байта при вызове socket вызывает такую лажу
     
  6. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Я на такую лажу натыкался c файлами работал))))
    Стек приходится по всей программе выравнивать, иначе любая функция винды тожет глюкнуть.
    Притом происходить это будет через раз, один раз откопмилил не сработала, второй раз откомпилил, пашет.
    Т.е. ты можешь даже не заметить проблему...