Работа с winsock.Error 10042:Bad protocol option.
Добавлено: 24 Март 2006, 6:57
				
				Господа, помогите разобраться с ошибкой.
Суть проблемы: программа слушает трафик,что-то вроде сниффера, так вот функция ioctlsocket() выдает ошибку 10042:Bad protocol option.
А так как опыта работы с винсокетами у меня практически нет, то не могу понять в чем проблема.
Ниже привожу текст программы.
На компе стоит WinXP Professional SP2,Clarion 6.1.
Заранее благодарна,
Анна.
			Суть проблемы: программа слушает трафик,что-то вроде сниффера, так вот функция 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_
Заранее благодарна,
Анна.
