@@ -44,6 +44,24 @@ STATIC const mp_obj_type_t socket_type;
4444
4545#define RAISE_ERRNO (x ) { int _err = x; if (_err < 0) mp_raise_OSError(-_err); }
4646
47+ STATIC void socket_check_closed (socket_obj_t * socket ) {
48+ if (socket -> ctx == NULL ) {
49+ // already closed
50+ mp_raise_OSError (EBADF );
51+ }
52+ }
53+
54+ STATIC void parse_inet_addr (socket_obj_t * socket , mp_obj_t addr_in , struct sockaddr * sockaddr ) {
55+ // We employ the fact that port and address offsets are the same for IPv4 & IPv6
56+ struct sockaddr_in * sockaddr_in = (struct sockaddr_in * )sockaddr ;
57+
58+ mp_obj_t * addr_items ;
59+ mp_obj_get_array_fixed_n (addr_in , 2 , & addr_items );
60+ sockaddr_in -> sin_family = net_context_get_family (socket -> ctx );
61+ RAISE_ERRNO (net_addr_pton (sockaddr_in -> sin_family , mp_obj_str_get_str (addr_items [0 ]), & sockaddr_in -> sin_addr ));
62+ sockaddr_in -> sin_port = htons (mp_obj_get_int (addr_items [1 ]));
63+ }
64+
4765// Methods
4866
4967STATIC void socket_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
@@ -88,6 +106,30 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
88106 return socket ;
89107}
90108
109+ STATIC mp_obj_t socket_bind (mp_obj_t self_in , mp_obj_t addr_in ) {
110+ socket_obj_t * socket = self_in ;
111+ socket_check_closed (socket );
112+
113+ struct sockaddr sockaddr ;
114+ parse_inet_addr (socket , addr_in , & sockaddr );
115+
116+ RAISE_ERRNO (net_context_bind (socket -> ctx , & sockaddr , sizeof (sockaddr )));
117+ return mp_const_none ;
118+ }
119+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_bind_obj , socket_bind );
120+
121+ STATIC mp_obj_t socket_connect (mp_obj_t self_in , mp_obj_t addr_in ) {
122+ socket_obj_t * socket = self_in ;
123+ socket_check_closed (socket );
124+
125+ struct sockaddr sockaddr ;
126+ parse_inet_addr (socket , addr_in , & sockaddr );
127+
128+ RAISE_ERRNO (net_context_connect (socket -> ctx , & sockaddr , sizeof (sockaddr ), NULL , K_FOREVER , NULL ));
129+ return mp_const_none ;
130+ }
131+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_connect_obj , socket_connect );
132+
91133STATIC mp_obj_t socket_close (mp_obj_t self_in ) {
92134 socket_obj_t * socket = self_in ;
93135 if (socket -> ctx != NULL ) {
@@ -101,6 +143,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
101143STATIC const mp_map_elem_t socket_locals_dict_table [] = {
102144 { MP_OBJ_NEW_QSTR (MP_QSTR___del__ ), (mp_obj_t )& socket_close_obj },
103145 { MP_OBJ_NEW_QSTR (MP_QSTR_close ), (mp_obj_t )& socket_close_obj },
146+ { MP_OBJ_NEW_QSTR (MP_QSTR_bind ), (mp_obj_t )& socket_bind_obj },
147+ { MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& socket_connect_obj },
104148};
105149STATIC MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
106150
0 commit comments