@@ -274,79 +274,63 @@ STATIC mp_obj_t socketpool_socket_recv_into(size_t n_args, const mp_obj_t *args)
274274}
275275STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socketpool_socket_recv_into_obj , 2 , 3 , socketpool_socket_recv_into );
276276
277- // //| def sendto(self, bytes: ReadableBuffer, address: tuple) -> int:
278- // //| """Send some bytes to a specific address.
279- // //| Suits sockets of type SOCK_DGRAM
280- // //|
281- // //| :param ~bytes bytes: some bytes to send
282- // //| :param ~tuple address: tuple of (remote_address, remote_port)"""
283- // //| ...
284- // //|
285-
286- // STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
287- // // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
277+ //| def sendto(self, bytes: ReadableBuffer, address: tuple) -> int:
278+ //| """Send some bytes to a specific address.
279+ //| Suits sockets of type SOCK_DGRAM
280+ //|
281+ //| :param ~bytes bytes: some bytes to send
282+ //| :param ~tuple address: tuple of (remote_address, remote_port)"""
283+ //| ...
284+ //|
288285
289- // // // get the data
290- // // mp_buffer_info_t bufinfo;
291- // // mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
286+ STATIC mp_obj_t socketpool_socket_sendto (mp_obj_t self_in , mp_obj_t data_in , mp_obj_t addr_in ) {
287+ socketpool_socket_obj_t * self = MP_OBJ_TO_PTR (self_in );
292288
293- // // // get address
294- // // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE] ;
295- // // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG );
289+ // get the data
290+ mp_buffer_info_t bufinfo ;
291+ mp_get_buffer_raise ( data_in , & bufinfo , MP_BUFFER_READ );
296292
297- // // // check if we need to select a NIC
298- // // socket_select_nic(self, ip );
293+ mp_obj_t * addr_items ;
294+ mp_obj_get_array_fixed_n ( addr_in , 2 , & addr_items );
299295
300- // // // call the NIC to sendto
301- // // int _errno;
302- // // mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
303- // // if (ret == -1) {
304- // // mp_raise_OSError(_errno);
305- // // }
306- // mp_int_t ret = 0;
296+ size_t hostlen ;
297+ const char * host = mp_obj_str_get_data (addr_items [0 ], & hostlen );
298+ mp_int_t port = mp_obj_get_int (addr_items [1 ]);
307299
308- // return mp_obj_new_int(ret);
309- // }
310- // STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto);
300+ mp_int_t ret = common_hal_socketpool_socket_sendto (self , host , hostlen , port , bufinfo .buf , bufinfo .len );
301+ if (!ok ) {
302+ mp_raise_OSError (0 );
303+ }
311304
312- // //| def recvfrom(self, bufsize: int) -> Tuple[bytes, tuple]:
313- // //| """Reads some bytes from the connected remote address.
314- // //| Suits sockets of type SOCK_STREAM
315- // //|
316- // //| Returns a tuple containing
317- // //| * a bytes() of length <= bufsize
318- // //| * a remote_address, which is a tuple of ip address and port number
319- // //|
320- // //| :param ~int bufsize: maximum number of bytes to receive"""
321- // //| ...
322- // //|
305+ return mp_obj_new_int_from_uint (ret );
306+ }
307+ STATIC MP_DEFINE_CONST_FUN_OBJ_3 (socketpool_socket_sendto_obj , socketpool_socket_sendto );
323308
324- // STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t len_in) {
325- // // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
326- // // if (self->nic == MP_OBJ_NULL) {
327- // // // not connected
328- // // mp_raise_OSError(MP_ENOTCONN);
329- // // }
330- // // vstr_t vstr;
331- // // vstr_init_len(&vstr, mp_obj_get_int(len_in));
332- // // byte ip[4];
333- // // mp_uint_t port;
334- // // int _errno;
335- // // mp_int_t ret = self->nic_type->recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
336- // // if (ret == -1) {
337- // // mp_raise_OSError(_errno);
338- // // }
339- // mp_obj_t tuple[2];
340- // // if (ret == 0) {
341- // // tuple[0] = mp_const_empty_bytes;
342- // // } else {
343- // // vstr.len = ret;
344- // // tuple[0] = mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
345- // // }
346- // // tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
347- // return mp_obj_new_tuple(2, tuple);
348- // }
349- // STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
309+ //| def recvfrom_into(self, buffer) -> Tuple[int, tuple]:
310+ //| """Reads some bytes from a remote address.
311+ //|
312+ //| Returns a tuple containing
313+ //| * the number of bytes received into the given buffer
314+ //| * a remote_address, which is a tuple of ip address and port number
315+ //|
316+ //| :param object buffer: buffer to read into"""
317+ //| ...
318+ //|
319+ STATIC mp_obj_t socketpool_socket_recvfrom_into (mp_obj_t self_in , mp_obj_t data_in ) {
320+ socketpool_socket_obj_t * self = MP_OBJ_TO_PTR (self_in );
321+ mp_buffer_info_t bufinfo ;
322+ mp_get_buffer_raise (data_in , & bufinfo , MP_BUFFER_WRITE );
323+
324+ byte ip [4 ];
325+ mp_uint_t port ;
326+ mp_int_t ret = common_hal_socketpool_socket_recvfrom_into (self ,
327+ (byte * )bufinfo .buf , len , ip , & port );
328+ mp_obj_t tuple_contents [2 ];
329+ tuple_contents [0 ] = mp_obj_new_int_from_uint (ret );
330+ tuple_contents [1 ] = netutils_format_inet_addr (ip , port , NETUTILS_BIG );
331+ return mp_obj_new_tuple (2 , tuple );
332+ }
333+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socketpool_socket_recvfrom_into_obj , socketpool_socket_recvfrom_into );
350334
351335// //| def setsockopt(self, level: int, optname: int, value: int) -> None:
352336// //| """Sets socket options"""
@@ -449,8 +433,8 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
449433 // { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
450434 { MP_ROM_QSTR (MP_QSTR_connect ), MP_ROM_PTR (& socketpool_socket_connect_obj ) },
451435 { MP_ROM_QSTR (MP_QSTR_send ), MP_ROM_PTR (& socketpool_socket_send_obj ) },
452- // { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) },
453- // { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) },
436+ { MP_ROM_QSTR (MP_QSTR_sendto ), MP_ROM_PTR (& socketpool_socket_sendto_obj ) },
437+ { MP_ROM_QSTR (MP_QSTR_recvfrom_into ), MP_ROM_PTR (& socketpool_socket_recvfrom_into_obj ) },
454438 { MP_ROM_QSTR (MP_QSTR_recv_into ), MP_ROM_PTR (& socketpool_socket_recv_into_obj ) },
455439 // { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
456440 { MP_ROM_QSTR (MP_QSTR_settimeout ), MP_ROM_PTR (& socketpool_socket_settimeout_obj ) },
0 commit comments