@@ -44,6 +44,24 @@ STATIC const mp_obj_type_t socket_type;
44
44
45
45
#define RAISE_ERRNO (x ) { int _err = x; if (_err < 0) mp_raise_OSError(-_err); }
46
46
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
+
47
65
// Methods
48
66
49
67
STATIC 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
88
106
return socket ;
89
107
}
90
108
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
+
91
133
STATIC mp_obj_t socket_close (mp_obj_t self_in ) {
92
134
socket_obj_t * socket = self_in ;
93
135
if (socket -> ctx != NULL ) {
@@ -101,6 +143,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
101
143
STATIC const mp_map_elem_t socket_locals_dict_table [] = {
102
144
{ MP_OBJ_NEW_QSTR (MP_QSTR___del__ ), (mp_obj_t )& socket_close_obj },
103
145
{ 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 },
104
148
};
105
149
STATIC MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
106
150
0 commit comments