Socket error 10038 (WSAENOTSOCK)

Discussion in 'WASM.NETWORKS' started by ECk, Feb 7, 2007.

  1. ECk

    ECk Member

    Blog Posts:
    0
    Joined:
    Apr 9, 2004
    Messages:
    454
    Location:
    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

    Blog Posts:
    0
    Joined:
    Feb 20, 2005
    Messages:
    51
    Location:
    Russia
    Это не мистика, а ошибка "socket operation on nonsocket". Юзай критические секции/interlocked-функции
     
  3. ECk

    ECk Member

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

    riban New Member

    Blog Posts:
    0
    Joined:
    Feb 20, 2005
    Messages:
    51
    Location:
    Russia
    ECk
    Про потоки в основной тулзе ты ничего не писал.
    Дык может либа кривая? Архитектура не та или ещё чего? У меня так было пару раз - 2е суток потерял:)
     
  5. ECk

    ECk Member

    Blog Posts:
    0
    Joined:
    Apr 9, 2004
    Messages:
    454
    Location:
    Russia
    Мегажесть :) - оказывается стек, не выровненный на 4 байта при вызове socket вызывает такую лажу
     
  6. Proteus

    Proteus Member

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