74 for (uip_userdata_t* data = &RF24Client::all_data[0]; data < &RF24Client::all_data[UIP_CONNS]; data++)
76 if (data->packets_in != 0 && (((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport == _port) || ((data->state & UIP_CLIENT_REMOTECLOSED) && ((uip_userdata_closed_t*)data)->lport == _port)))
88 if (millis() - timeoutTimer > RF24Client::serverConnectionTimeout) {
90 if (RF24Client::_socket >= 0) {
91 zsock_close(RF24Client::_socket);
92 RF24Client::_socket = -1;
94 timeoutTimer = millis();
98 if (!
Ethernet.isInitialized || !serverListening ||
connectionActive || RF24Client::g_rf24client_instance->_socket > 0) {
100 timeoutTimer = millis();
105 struct sockaddr_in client_addr;
106 socklen_t client_addr_len =
sizeof(client_addr);
109 int client_sock = zsock_accept(
serverSocket, (
struct sockaddr*)&client_addr, &client_addr_len);
111 if (client_sock < 0) {
113 if (errno == EAGAIN || errno == EWOULDBLOCK) {
116 timeoutTimer = millis();
122 printk(
"CRITICAL Accept error: %d\n", errno);
124 timeoutTimer = millis();
130 printk(
"Connection accepted (FD: %d)\n", client_sock);
133 serverClient._socket = client_sock;
134 RF24Client::g_rf24client_instance = &serverClient;
135 timeoutTimer = millis();
150 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
152 ETHERNET_APPLY_LOCK();
158 if (sPcb ==
nullptr) {
162 if (sPcb !=
nullptr) {
166 err_t err = tcp_bind(sPcb, IP_ADDR_ANY, RF24Server::_port);
173 if (serverState ==
nullptr) {
179 if (serverState !=
nullptr) {
180 serverState->connected =
false;
181 serverState->result = 0;
182 serverState->waiting_for_ack =
false;
184 sPcb = tcp_listen_with_backlog(sPcb, 1);
186 if (sPcb !=
nullptr) {
187 tcp_arg(sPcb, serverState);
188 tcp_accept(sPcb, RF24Client::accept);
194 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
196 ETHERNET_REMOVE_LOCK();
202 struct sockaddr_in bind_addr;
204 serverSocket = zsock_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
206 printk(
"Socket creation failed: %d", errno);
211 memset(&bind_addr, 0,
sizeof(bind_addr));
212 bind_addr.sin_family = AF_INET;
213 bind_addr.sin_port = htons(_port);
214 bind_addr.sin_addr.s_addr = INADDR_ANY;
216 if (zsock_bind(
serverSocket, (
struct sockaddr*)&bind_addr,
sizeof(bind_addr)) < 0) {
217 printk(
"Bind failed: %d", errno);
224 printk(
"Listen failed: %d", errno);
231 if (flags < 0 || zsock_fcntl(
serverSocket, F_SETFL, flags | O_NONBLOCK) < 0) {
232 printk(
"Failed to set non-blocking flag: %d", errno);
237 serverListening =
true;
238 printk(
"Server initialized successfully!");
266 for (uip_userdata_t* data = &RF24Client::all_data[0]; data < &RF24Client::all_data[UIP_CONNS]; data++)
268 if ((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport == _port)
269 ret += RF24Client::_write(data, buf, size);
273 RF24Client::_write(&data, buf, size);