我在窗体 onshow事件中调用了一个线程~
在这个线程里 创建了一个udp socket~头次接收正确后~
第二次接收时候失败了~
错误提示 10038~
但我并没有关闭socket~我查看了socket在第二次接收时的值变为0了~第一次是有值的
错误码10038的解释是 在一个无效套接字进行操作~我是头一次用多线程~
是不是在线程里不能创建socket~
线程里有个死循环用来接收东西的~
在这个线程里 创建了一个udp socket~头次接收正确后~
第二次接收时候失败了~
错误提示 10038~
但我并没有关闭socket~我查看了socket在第二次接收时的值变为0了~第一次是有值的
错误码10038的解释是 在一个无效套接字进行操作~我是头一次用多线程~
是不是在线程里不能创建socket~
线程里有个死循环用来接收东西的~
大概源码是这样子的~线程这块儿我是初次学习不太会用~有些东西不是很明白~
在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 在一个无效套接字进行操作~
begin
FreeOnTerminate:=True;
udprecv;
end;
我在其他窗口需要调用这个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;
skt:=socket(af_inet,sock_stream,ipproto_tcp);
re:=recvfrom(skt1,udp_pack,SizeOf(udp_pack),0,addr2,i);
tcp的是 skt 是个全局的
udp是skt1 在线程里~