Работа с winsock.Error 10042:Bad protocol option.

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Ann

Работа с winsock.Error 10042:Bad protocol option.

Сообщение Ann »

Господа, помогите разобраться с ошибкой.
Суть проблемы: программа слушает трафик,что-то вроде сниффера, так вот функция ioctlsocket() выдает ошибку 10042:Bad protocol option.
А так как опыта работы с винсокетами у меня практически нет, то не могу понять в чем проблема.
Ниже привожу текст программы.

Код: Выделить всё


Global Data
include('Winsock.inc')
sock     SOCKET
Prmod     ULONG
sopt       ULONG       

code

err#=WSACleanUP()
clear(PWSAData)
if WSAStartup(s32_Version2_0,address(PWSAData))<>0
   Message('Error wsastartup:'&WSAGetLastError())
end

Sock=Createsocket(AF_INET,SOCK_STREAM,IPPROTO_IP)
IF Sock < 0
   Message('Error createsocket - '&WSAGetLastError())
ELSE
  sopt=True
  if setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,address(sopt),size(sopt))<>0
     Message('Setsockopt error - '&WSAGetLastError())
  else
    s_in.sin_family = AF_INET               
    s_in.sin_addr.s_addr = INADDR_ANY 
  end
END

if BindSocket(Sock,address(s_in),Size(s_in))= SOCKET_ERROR      Message('Error bindsocket - '&WSAGetLastError())
   CloseSocket(Sock)
end

PrMod=1
if ioctlsocket(Sock,SIO_RCVALL,PrMod) <> 0      
   Message('Error - '&WSAGetLastError())    ! здесь выдет ошибку 10042
   CloseSocket(Sock)
   err#=WSACleanUP()
end
!здесь буду принимать данные
!

CloseSocket(Sock)
err#=WSACleanUP()

!!!!!!!!!!!!!!!!!!!!!!!!
файл winsock.inc

OMIT('_EndOfInclude_',_WINSOCK_)
_WINSOCK_  EQUATE(1)
INCLUDE('WINDOWS.INC'),ONCE

WSAData                 GROUP,TYPE
wVersion                  SHORT
wHighVersion              SHORT
szDescription             CSTRING(WSADESCRIPTION_LEN + 1)
szSystemStatus            CSTRING(WSASYS_STATUS_LEN + 1)
iMaxSockets               UNSIGNED
iMaxUdpDg                 UNSIGNED
lpVendorInfo              LONG
                        END
PWSAData      LIKE(WSAData)

in_addr                 GROUP,TYPE
s_b1                      BYTE
s_b2                      BYTE
s_b3                      BYTE
s_b4                      BYTE
S_addr                    LONG
                        END

SOCKADDR_IN             GROUP,TYPE
sin_family                SHORT
sin_port                  USHORT
!sin_addr                  LIKE(in_addr),pre(sin)
sin_addr                  LIKE(in_addr)
sin_zero                  STRING(8)
                        END
s_in                LIKE(SOCKADDR_IN)


SOCKET_ERROR            EQUATE(-1)
s32_Version2_0          EQUATE(1000000010b) 
INADDR_ANY        EQUATE(0)
SIO_RCVALL     EQUATE(98000001h)
SOCKET                  EQUATE(LONG)
SOCK_STREAM             EQUATE(1)
IPPROTO_IP              EQUATE(0)
AF_INET                 EQUATE(2)
SOL_SOCKET              EQUATE(0ffffh)
SO_REUSEADDR      EQUATE(04h)

MAP
 MODULE('WinApi')
  WSAStartup          PROCEDURE(SHORT wVersionRequested, LONG lpWSAData),SIGNED,PASCAL
  WSACleanup          PROCEDURE(),SIGNED,PASCAL
  WSAGetLastError     PROCEDURE(),SIGNED,PASCAL,NAME('WSAGetLastError')
  CreateSocket        PROCEDURE(SIGNED af, SIGNED type, SIGNED protocol),SOCKET,PASCAL,NAME('socket')
  CloseSocket         PROCEDURE(SOCKET s),SIGNED,PROC,PASCAL,NAME('closesocket')
  ReceiveData         PROCEDURE(SOCKET s, LONG lpstrBuffer, SIGNED dwLen, SIGNED flags),SIGNED,PASCAL,NAME('recv')
  BindSocket          PROCEDURE(SOCKET s, LONG lpname, SIGNED namelen),SIGNED,RAW,PASCAL,NAME('bind')
  Listen              PROCEDURE(SOCKET s, SIGNED backlog),SIGNED,PASCAL,NAME('listen')
  setsockopt          PROCEDURE(SOCKET s, SIGNED level, SIGNED optname, LONG lpszOptVal, SIGNED optlen),SIGNED,PASCAL
  Ioctlsocket              PROCEDURE(SOCKET s,LONG,*ULONG),SHORT,RAW,PASCAL,NAME('IOCTLSOCKET')
 END
end

_EndOfInclude_
На компе стоит WinXP Professional SP2,Clarion 6.1.
Заранее благодарна,
Анна.
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение Admin »

да ... судя по msdn где то не верно опции какие то установлены ...

"... Bad protocol option. An unknown, invalid or unsupported option or level was specified in a getsockopt or setsockopt call ..."

нужно думать :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение Admin »

кстати приведенный код сходу у меня не заработал ...
вот подправленый немного. делаем проект пустой и цепляем код.
Андрюха может посмотришь? Поможем даме? :)

Код: Выделить всё

                 PROGRAM
                 INCLUDE('winsock.inc')
                 MAP
                   MODULE('WinApi')
                     Ioctlsocket(SOCKET s,LONG,*ULONG),SHORT,RAW,PASCAL,NAME('IOCTLSOCKET')
                   END
                 END

s32_Version2_0   EQUATE(1000000010b)
INADDR_ANY       EQUATE(0)
SIO_RCVALL       EQUATE(98000001h)
SOCKET           EQUATE(LONG)
SOL_SOCKET       EQUATE(0ffffh)

s_in             LIKE(SOCKADDR_IN)
PWSAData         LIKE(WSAData)

sock             SOCKET
Prmod            ULONG
sopt             ULONG

  CODE

  err#=WSACleanUP()
  clear(PWSAData)
  if WSAStartup(s32_Version2_0,address(PWSAData))<>0
     Message('Error wsastartup:'&WSAGetLastError())
  end

  Sock=Createsocket(AF_INET,SOCK_STREAM,IPPROTO_IP) 
  IF Sock < 0 
     Message('Error createsocket - '&WSAGetLastError()) 
  ELSE 
    sopt=True 
    if setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,address(sopt),size(sopt))<>0 
       Message('Setsockopt error - '&WSAGetLastError()) 
    else 
      s_in.sin_family = AF_INET                
      s_in.sin_addr.s_addr = INADDR_ANY 
    end 
  END 

  if BindSocket(Sock,address(s_in),Size(s_in))= SOCKET_ERROR
     Message('Error bindsocket - '&WSAGetLastError())
     CloseSocket(Sock) 
  end 

  PrMod=1 
  if ioctlsocket(Sock,SIO_RCVALL,PrMod) <> 0      
     Message('Error - '&WSAGetLastError())    ! здесь выдет ошибку 10042 
     CloseSocket(Sock) 
     err#=WSACleanUP() 
  end 
  !здесь буду принимать данные 
  ! 
  CloseSocket(Sock)
  err#=WSACleanUP() 

Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Сообщение Andrew Listiev »

Позволю себе цитату из MSDN На лицо ошибка создания сокета, нужное выделил.

SIO_RCVALL
Enables a socket to receive all IP packets on the network. The socket handle passed to the WSAIoctl function
must be of AF_INET address family, SOCK_RAW socket type, and IPPROTO_IP protocol. The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.
Once the socket is bound and the ioctl set, calls to the WSARecv or recv functions return IP datagrams passing through the given interface. Note that you must supply a sufficiently large buffer. Setting this ioctl requires Administrator privilege on the local computer. SIO_RCVALL is available in Windows 2000 and later versions of Windows.
Ann

Сообщение Ann »

Спасибо, вам, Андрей, буду пробовать.
Ответить