Socket error 10038 (WSAENOTSOCK)

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

  1. ECk

    ECk Member

    Публикаций:
    0
    Добрый день всем!
    Мистика какая-то творится. При вызове 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
    Это не мистика, а ошибка "socket operation on nonsocket". Юзай критические секции/interlocked-функции
     
  3. ECk

    ECk Member

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

    riban New Member

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

    ECk Member

    Публикаций:
    0
    Мегажесть :) - оказывается стек, не выровненный на 4 байта при вызове socket вызывает такую лажу
     
  6. Proteus

    Proteus Member

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