部分程序如下:implementation// Import Winsock 2 functions
const WinSocket = 'WS2_32.DLL';
function socket; external winsocket name 'socket';
.........procedure TForm1.Button1Click(Sender: TObject);
var
    local : TSockAddr;
    skt : TSocket;begin
     skt:=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
     if(skt=INVALID_SOCKET)then
     begin
           StatusBar1.SimpleText:='Error:Create Socket Failed!'; 
           exit;
     end;
     bOpt:=1;
     ret:=SetSockOpt(skt, IPPROTO_IP, IP_HDRINCL, @bOpt, SizeOf(bOpt));
     if ret = SOCKET_ERROR then
     begin
           Memo1.lines.add('setsockopt(IP_HDRINCL) failed: '+IntToStr(WSAGetLastError));
           exit;
     end;
     ZeroMemory(@local,sizeof(local));
     local.sin_family:=AF_INET;
     local.sin_addr.S_addr:=inet_addr(pchar('192.168.0.1'));     bind(skt, local, sizeof(local));
end;
程序总是在执行到socket(AF_INET,SOCK_RAW,IPPROTO_RAW)时返回值总是INVALID_SOCKET到底是错那拉?还有就是怎么使用ioctlsocket接受所有的数据包?还有就是怎么用WSAIoctl来注册WSA的输入输出组件?最好举个例子。谢谢!

解决方案 »

  1.   

    uses   winsock
    var
      socket1:=socket(AF_INT,SOCK_STREAM,0);
      if (socket1=INVALID_SOCKET) then
         begin
         ........
         end;
      

  2.   

    先要调用 WSAStartup 初始化
      

  3.   

    TO:已经用WSAStartup初始化过啦,并且我用的系统是win2000 professional.procedure TForm1.CreateForm(Sender: TObject);
    var
       wsdata : TWSAdata;
    begin
         if (WSAStartup(MAKEWORD(2, 2), wsdata)<>0) then
         begin
              StatusBar1.SimpleText:='Init Failed!';
              exit;
         end
         else
              StatusBar1.SimpleText:='Init success!';
    end;
    To: sdlzlj(邵东烂仔刘佳) 
       我现在需要的是原始数据套接字类型