请问高人:winsock UDP Server 接收数据后调用消息处理类,却丢失客户端地址

请教高人:winsock UDP Server 接收数据后调用消息处理类,却丢失客户端地址
服务端
procedure TServerForm.WMSOCKET(var msg: TMessage);
var
  addr: TSockAddrIn; 
  addrlen: Integer;
  buffer: array [0..255] of byte;
  SocketMsgHandler:TMsgHandler;
begin
  case WSAGetSelectEvent(msg.LParam) of
  FD_READ:
  begin
  addrlen:=sizeof(addr);  
  recvfrom(sock,buffer,255,@addr,addrlen); 
  SocketMsgHandler.handleMessage(buffer,addr);
end;

我的消息处理类也很简单,代码:
procedure TMsgHandler.handleMessage(buffer:array of byte;addr: TSockAddrIn);
begin
  //先处理数据
  .......
  //然后返回处理结果,所用的sock已经从主类传递过来  
  sendto(sock,data,sizeof(data),0,@addr,addrlen);
end;

可是我的客户端死活等不到返回结果。
如果我把处理逻辑直接copy到主程序的消息函数中,客户端就可以成功收到消息,修改后可用的代码如下
procedure TServerForm.WMSOCKET(var msg: TMessage);
var
  addr: TSockAddrIn; 
  addrlen: Integer;
  buffer: array [0..255] of byte;
  SocketMsgHandler:TMsgHandler;
begin
  case WSAGetSelectEvent(msg.LParam) of
  FD_READ:
  begin
  addrlen:=sizeof(addr);  
  recvfrom(sock,buffer,255,@addr,addrlen); 
  //直接理数据
  .......
  //然后返回处理结果,所用的sock已经从主类传递过来  
  sendto(sock,data,sizeof(data),0,@addr,addrlen);
end;

请问各位老大,是什么原因呢?


------解决方案--------------------
为你能自己解决问题而高兴,有机会在此问题上向你讨教讨教。

谢谢你的关照!