哦,是在recvfrom时返回的错误。 var Form1: TForm1; sock_udp:integer;
还有,第一次接收出错以后,第二次来数据时没有重置event1为有信号。 waitforsingleobject(event1,infinite);一直等待。 procedure threadread; var p:recvpoin; addr_r:sockaddr_in; count,i,sock:integer ; begin while (true) do begin waitforsingleobject(event1,infinite); getmem(p,sizeof(recvdata)); zeromemory(p,sizeof(recvdata)); //sock_udp 是在form1.create中创建并跟fd_read捆绑一起的udp套接字 count:=recvfrom(sock_udp,p^,sizeof(recvdata),0,addr_r,i); if count=socket_error then begin ndmessage(form1.ListBox1.Handle,lb_addstring,0,longint(inttostr(wsagetlasterror())));//报错10014:地址出错; end; freemem(p); resetevent(event1); end; end;
udp数据报不需要listen吧?
udp数据报不需要listen吧?
sockaddr_in SockAddr;
SOCKET ListenSocket;
HANDLE hEvent;
WSADATA Data; ZeroMemory(&SockAddr,sizeof(sockaddr_in)); SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=inet_addr("218.65.236.76");//这是我的动态IP地址,不是局域网地址
SockAddr.sin_port=5252;
if(WSAStartup(MAKEWORD(2,0),&Data)!=0)
{
Memo1->Lines->Add("Error Call WSAStartup");
return;
} ListenSocket=socket(AF_INET,SOCK_DGRAM,0);
if(ListenSocket==INVALID_SOCKET)
{
Memo1->Lines->Add("Error Create Socket="+SysErrorMessage(WSAGetLastError()));
return;
} hEvent=CreateEvent(NULL,false,false,NULL);
if(hEvent==NULL)
{
Memo1->Lines->Add("Error Create Event="+SysErrorMessage(GetLastError()));
return;
}
if(bind(ListenSocket,(const struct sockaddr FAR*)&SockAddr,sizeof(sockaddr_in))==SOCKET_ERROR)
{
Memo1->Lines->Add("Error Bind Socket="+SysErrorMessage(WSAGetLastError()));
return;
} WSAEventSelect(ListenSocket,hEvent,FD_READ);//一切正常
我也不清楚问题出在哪里,bind函数没错的,我用wsaasyncselect模型在这套接字上可以接收。而且,如果不用createevent而是用wsacreateevent的话,在执行wsacreateevent这一句时也出现同样错误。我想是不是引用SConnect单元的问题??
无法打开指定的设备驱动?
同一台机子,
DELPHI:
hdrv:=opendriver(pwidechar(pchar('VIDC.IV32')),nil,0);//返回0;
VC:
hdrv=(HDRVR)OpenDriver(L"VIDC.IV32",NULL,0L);//返回非0;
究竟是什么回事,谁能帮我解说一下?????
无法打开指定的设备驱动?
同一台机子,
DELPHI:
hdrv:=opendriver(pwidechar(pchar('VIDC.IV32')),nil,0);//返回0;
VC:
hdrv=(HDRVR)OpenDriver(L"VIDC.IV32",NULL,0L);//返回非0;
究竟是什么回事,谁能帮我解说一下?????
..>> >>if(WSAStartup(MAKEWORD(2,0),&Data)!=0)
~~~~~~~~~~\看看是不是跟你系统的Socket版本有关?
没用,还是同样出错。
有时CreateEvenT的第四个参数为NULL的时候,创建事件不成功。
试试把创建的事件指定个名字。
比如改成
event1:=createevent(nil,false,false,'udp_event');希望有用。
在Sconnect单元里面是动态载入 winsock2的,你必须调用它的
function LoadWinSock2: Boolean;后才可以使用WSACreateEvent
你看看Sconnect单元的相关源码就会知道的。
在Sconnect单元里面是动态载入 winsock2的,你必须调用它的
function LoadWinSock2: Boolean;后才可以使用WSACreateEvent
你看看Sconnect单元的相关源码就会知道的。
createevent(nil,false,false,nil);
wsaeventselect(sock_udp,event1,fd_read);
thread1:=createthread(nil,0,@threadread,nil,0,threadid1);接收线程
var
p:^recvdata;
waitforsingleobject(event1,infinite);
getmem(p,sizeof(recvdata));
zeromemory(p,sizeof(recvdata));
count:=recvfrom(sock_udp,p^,sizeof(recvdata),0,addr_r,i);
返回错误:10014 地址错误;
可是在wsaasyncselect模型下,同样的语句可以接收到数据。
可以解释一下是什么原因吗?
var
Form1: TForm1;
sock_udp:integer;
waitforsingleobject(event1,infinite);一直等待。
procedure threadread;
var
p:recvpoin;
addr_r:sockaddr_in;
count,i,sock:integer ;
begin
while (true) do
begin
waitforsingleobject(event1,infinite);
getmem(p,sizeof(recvdata));
zeromemory(p,sizeof(recvdata));
//sock_udp 是在form1.create中创建并跟fd_read捆绑一起的udp套接字
count:=recvfrom(sock_udp,p^,sizeof(recvdata),0,addr_r,i);
if count=socket_error then
begin
ndmessage(form1.ListBox1.Handle,lb_addstring,0,longint(inttostr(wsagetlasterror())));//报错10014:地址出错;
end;
freemem(p);
resetevent(event1);
end;
end;