@@ -1167,17 +1167,6 @@ do -- addrinfo
11671167
11681168 return addrinfos [1 ]
11691169 end
1170-
1171- function M .addrinfo_for_receive (ai_addr , len , family )
1172- -- Create a minimal addrinfo structure with the received address
1173- local ai = addrinfo_out ()
1174- ai .ai_addr = ai_addr
1175- ai .ai_addrlen = len
1176- ai .ai_family = AF .strict_lookup (family )
1177-
1178- -- Use the existing addressinfo constructor which properly sets up the metatable
1179- return M .addressinfo (ai , nil , nil )
1180- end
11811170end
11821171
11831172do
@@ -1415,40 +1404,40 @@ do
14151404
14161405 local sockaddr_in_boxed = ffi .typeof (" $[1]" , sockaddr_in )
14171406
1418- function meta :receive_from (address , size , flags )
1419- local src_addr
1420- local src_addr_size
1421-
1422- if not address then
1423- src_addr = sockaddr_in_boxed ()
1424- src_addr_size = ffi .sizeof (sockaddr_in )
1425- else
1426- src_addr = address .addrinfo .ai_addr
1427- src_addr_size = address .addrinfo .ai_addrlen
1428- end
1429-
1430- return self :receive (size , flags , src_addr , src_addr_size )
1407+ function meta :receive_from (size , flags )
1408+ return self :receive (size , flags , true )
14311409 end
14321410
1433- function meta :receive (size , flags , src_address , address_len )
1411+ function meta :receive (size , flags , return_address )
14341412 size = size or 64000
14351413 local buff = ffi .new (" char[?]" , size )
14361414
14371415 if self .on_receive then return self :on_receive (buff , size , flags ) end
14381416
14391417 local len , err , num
1440- local len_res
14411418
1442- if src_address then
1443- len_res = ffi .new (" int[1]" , address_len )
1419+ local addrinfo
1420+
1421+ if return_address then
1422+ local src_address = sockaddr_in_boxed ()
1423+ local ai_addrlen_res = ffi .new (" int[1]" , ffi .sizeof (sockaddr_in ))
1424+
14441425 len , err , num = socket .recvfrom (
14451426 self .fd ,
14461427 buff ,
14471428 ffi .sizeof (buff ),
14481429 flags or 0 ,
14491430 ffi .cast (sockaddr_ptr , src_address ),
1450- len_res
1431+ ai_addrlen_res
14511432 )
1433+
1434+ if len and len > 0 then
1435+ addrinfo = M .addressinfo (addrinfo_out ({
1436+ ai_addr = ffi .cast (sockaddr_ptr , src_address ),
1437+ ai_addrlen = ai_addrlen_res [0 ],
1438+ ai_family = AF .strict_lookup (self .family ),
1439+ }))
1440+ end
14521441 else
14531442 len , err , num = socket .recv (self .fd , buff , ffi .sizeof (buff ), flags or 0 )
14541443 end
@@ -1480,12 +1469,7 @@ do
14801469 if len > 0 then
14811470 if self .debug then print (tostring (self ), " : received " , len , " bytes" ) end
14821471
1483- if src_address then
1484- return ffi .string (buff , len ),
1485- M .addrinfo_for_receive (ffi .cast (sockaddr_ptr , src_address ), len_res [0 ], self .family )
1486- end
1487-
1488- return ffi .string (buff , len )
1472+ return ffi .string (buff , len ), addrinfo
14891473 end
14901474
14911475 return nil , err , num
0 commit comments