@@ -153,6 +153,7 @@ STATIC mp_obj_t socket_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_
153153 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
154154 }
155155
156+ s -> has_timeout = false;
156157 modusocket_socket_add (s -> sd , true);
157158 return s ;
158159}
@@ -261,6 +262,9 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
261262 int _errno ;
262263 mp_uint_t ret = wlan_socket_recv (self , (byte * )vstr .buf , len , & _errno );
263264 if (ret == -1 ) {
265+ if (_errno == EAGAIN && self -> has_timeout ) {
266+ nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
267+ }
264268 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
265269 }
266270 if (ret == 0 ) {
@@ -304,6 +308,9 @@ STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
304308 int _errno ;
305309 mp_int_t ret = wlan_socket_recvfrom (self , (byte * )vstr .buf , vstr .len , ip , & port , & _errno );
306310 if (ret == -1 ) {
311+ if (_errno == EAGAIN && self -> has_timeout ) {
312+ nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
313+ }
307314 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
308315 }
309316 mp_obj_t tuple [2 ];
@@ -446,6 +453,10 @@ STATIC const mp_map_elem_t mp_module_usocket_globals_table[] = {
446453 { MP_OBJ_NEW_QSTR (MP_QSTR_socket ), (mp_obj_t )& socket_type },
447454 { MP_OBJ_NEW_QSTR (MP_QSTR_getaddrinfo ), (mp_obj_t )& mod_usocket_getaddrinfo_obj },
448455
456+ // class exceptions
457+ { MP_OBJ_NEW_QSTR (MP_QSTR_error ), (mp_obj_t )& mp_type_OSError },
458+ { MP_OBJ_NEW_QSTR (MP_QSTR_timeout ), (mp_obj_t )& mp_type_TimeoutError },
459+
449460 // class constants
450461 { MP_OBJ_NEW_QSTR (MP_QSTR_AF_INET ), MP_OBJ_NEW_SMALL_INT (AF_INET ) },
451462 { MP_OBJ_NEW_QSTR (MP_QSTR_AF_INET6 ), MP_OBJ_NEW_SMALL_INT (AF_INET6 ) },
0 commit comments