我在窗体 onshow事件中调用了一个线程~
在这个线程里 创建了一个udp socket~头次接收正确后~
第二次接收时候失败了~
错误提示 10038~
但我并没有关闭socket~我查看了socket在第二次接收时的值变为0了~第一次是有值的
错误码10038的解释是 在一个无效套接字进行操作~我是头一次用多线程~
是不是在线程里不能创建socket~
线程里有个死循环用来接收东西的~

解决方案 »

  1.   

    你好~sanguomi~
    大概源码是这样子的~线程这块儿我是初次学习不太会用~有些东西不是很明白~
    在unit1单元里:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if (WSAStartup(MAKEWORD(2,2),WSAData1)<>0) then
      begin
       showmessage('winsock初始化失败');
       exit;
      end;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      recvthead:=TMythead.Create(False);
    end;不太会用线程~
    在线程单元里
    type
      TMythead = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
        procedure udprecv;
      end;procedure TMythead.udprecv;
    var
      skt1:TSocket;
    begin
      skt1:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);  
      ZeroMemory(@addr2,SizeOf(addr2));
      addr2.sin_family:=AF_INET;
      addr2.sin_port:=htons(30000);
            ..
            ..
      i_loop:=1;
    while i_loop > 0 do
     begin
      FillChar(udp_pack,SizeOf(udp_pack),0);
      precvbuff:=@recvbuff;
      i:=SizeOf(addr2);
      re:=recvfrom(skt1,udp_pack,SizeOf(udp_pack),0,addr2,i);
        .
        .
        .
      i_loop:=i_loop+1;
    end;
    end;大概就是这样子了~其他的都是些赋值语句一类的了
    我用单步调试看~
    进入循环后~
    skt1在第一次接收时候值为1840接收正常~循环的第二次skt1值就变为0了
    然后弹出错误 10038 在一个无效套接字进行操作~
      

  2.   

    procedure TMythead.Execute;
    begin
     FreeOnTerminate:=True;
     udprecv;
    end;
      

  3.   

    我在 oncreate事件里还创建了个 tcp的 全局skt~
    我在其他窗口需要调用这个skt~
    这个会不会有什么影响呢? 
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if (WSAStartup(MAKEWORD(2,2),WSAData1)<>0) then
      begin
       showmessage('winsock初始化失败');
       exit;
      end;  skt:=socket(af_inet,sock_stream,ipproto_tcp);  if (skt=INVALID_SOCKET)then
      begin
        showmessage('创建socket失败');
        exit;
      end;  ZeroMemory(@addr,sizeof(addr));
      addr.sin_family:=af_inet;
      addr.sin_port:=htons(32734); //32734
      addr.sin_addr.S_addr:=inet_addr('192.168.0.1');
      i:=connect(skt,addr,sizeof(addr));
      if i<>0 then
      begin
        ShowMessage('TCP连接失败');
      end;
      

  4.   

    怎么TCP和UDP混着用啊
    skt:=socket(af_inet,sock_stream,ipproto_tcp);
    re:=recvfrom(skt1,udp_pack,SizeOf(udp_pack),0,addr2,i);
      

  5.   

    哦 两个socket是不一样的
    tcp的是 skt 是个全局的 
    udp是skt1 在线程里~