|
36 | 36 | #include "py/runtime.h"
|
37 | 37 | #include "py/mperrno.h"
|
38 | 38 |
|
| 39 | +#include "lib/netutils/netutils.h" |
| 40 | + |
39 | 41 | //| class Socket:
|
40 | 42 | //| """TCP, UDP and RAW socket. Cannot be created directly. Instead, call
|
41 | 43 | //| `SocketPool.socket()`.
|
@@ -274,79 +276,63 @@ STATIC mp_obj_t socketpool_socket_recv_into(size_t n_args, const mp_obj_t *args)
|
274 | 276 | }
|
275 | 277 | STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_recv_into_obj, 2, 3, socketpool_socket_recv_into);
|
276 | 278 |
|
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); |
| 279 | +//| def sendto(self, bytes: ReadableBuffer, address: Tuple[str, int]) -> int: |
| 280 | +//| """Send some bytes to a specific address. |
| 281 | +//| Suits sockets of type SOCK_DGRAM |
| 282 | +//| |
| 283 | +//| :param ~bytes bytes: some bytes to send |
| 284 | +//| :param ~tuple address: tuple of (remote_address, remote_port)""" |
| 285 | +//| ... |
| 286 | +//| |
288 | 287 |
|
289 |
| -// // // get the data |
290 |
| -// // mp_buffer_info_t bufinfo; |
291 |
| -// // mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ); |
| 288 | +STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) { |
| 289 | + socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); |
292 | 290 |
|
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); |
| 291 | + // get the data |
| 292 | + mp_buffer_info_t bufinfo; |
| 293 | + mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ); |
296 | 294 |
|
297 |
| -// // // check if we need to select a NIC |
298 |
| -// // socket_select_nic(self, ip); |
| 295 | + mp_obj_t *addr_items; |
| 296 | + mp_obj_get_array_fixed_n(addr_in, 2, &addr_items); |
299 | 297 |
|
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; |
| 298 | + size_t hostlen; |
| 299 | + const char* host = mp_obj_str_get_data(addr_items[0], &hostlen); |
| 300 | + mp_int_t port = mp_obj_get_int(addr_items[1]); |
307 | 301 |
|
308 |
| -// return mp_obj_new_int(ret); |
309 |
| -// } |
310 |
| -// STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto); |
| 302 | + mp_int_t ret = common_hal_socketpool_socket_sendto(self, host, hostlen, port, bufinfo.buf, bufinfo.len); |
| 303 | + if (!ret) { |
| 304 | + mp_raise_OSError(0); |
| 305 | + } |
311 | 306 |
|
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 |
| -// //| |
| 307 | + return mp_obj_new_int_from_uint(ret); |
| 308 | +} |
| 309 | +STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto); |
323 | 310 |
|
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); |
| 311 | +//| def recvfrom_into(self, buffer: WriteableBuffer) -> Tuple[int, Tuple[str, int]]: |
| 312 | +//| """Reads some bytes from a remote address. |
| 313 | +//| |
| 314 | +//| Returns a tuple containing |
| 315 | +//| * the number of bytes received into the given buffer |
| 316 | +//| * a remote_address, which is a tuple of ip address and port number |
| 317 | +//| |
| 318 | +//| :param object buffer: buffer to read into""" |
| 319 | +//| ... |
| 320 | +//| |
| 321 | +STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t data_in) { |
| 322 | + socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); |
| 323 | + mp_buffer_info_t bufinfo; |
| 324 | + mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_WRITE); |
| 325 | + |
| 326 | + byte ip[4]; |
| 327 | + mp_uint_t port; |
| 328 | + mp_int_t ret = common_hal_socketpool_socket_recvfrom_into(self, |
| 329 | + (byte*)bufinfo.buf, bufinfo.len, ip, &port); |
| 330 | + mp_obj_t tuple_contents[2]; |
| 331 | + tuple_contents[0] = mp_obj_new_int_from_uint(ret); |
| 332 | + tuple_contents[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG); |
| 333 | + return mp_obj_new_tuple(2, tuple_contents); |
| 334 | +} |
| 335 | +STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into); |
350 | 336 |
|
351 | 337 | // //| def setsockopt(self, level: int, optname: int, value: int) -> None:
|
352 | 338 | // //| """Sets socket options"""
|
@@ -449,8 +435,8 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
|
449 | 435 | // { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
|
450 | 436 | { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&socketpool_socket_connect_obj) },
|
451 | 437 | { 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) }, |
| 438 | + { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) }, |
| 439 | + { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) }, |
454 | 440 | { MP_ROM_QSTR(MP_QSTR_recv_into), MP_ROM_PTR(&socketpool_socket_recv_into_obj) },
|
455 | 441 | // { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
|
456 | 442 | { MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socketpool_socket_settimeout_obj) },
|
|
0 commit comments