forked from PaulStoffregen/Ethernet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEthernetServer.cpp
More file actions
64 lines (56 loc) · 1.36 KB
/
EthernetServer.cpp
File metadata and controls
64 lines (56 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "Ethernet.h"
#include "w5100.h"
uint16_t EthernetServer::server_port[MAX_SOCK_NUM];
void EthernetServer::begin()
{
sockindex = Ethernet.socketBegin(SnMR::TCP, _port);
if (sockindex < MAX_SOCK_NUM) {
Ethernet.socketListen(sockindex);
server_port[sockindex] = _port;
}
}
void EthernetServer::accept()
{
bool listening = false;
if (sockindex < MAX_SOCK_NUM) {
uint8_t status = Ethernet.socketStatus(sockindex);
if (status == SnSR::LISTEN) {
listening = true;
} else if (status == SnSR::CLOSE_WAIT && Ethernet.socketRecvAvailable(sockindex) <= 0) {
Ethernet.socketDisconnect(sockindex);
}
}
if (!listening) begin();
}
EthernetClient EthernetServer::available()
{
accept();
for (uint8_t i=0; i < MAX_SOCK_NUM; i++) {
if (server_port[i] == _port) {
uint8_t stat = Ethernet.socketStatus(i);
if (stat == SnSR::ESTABLISHED || stat == SnSR::CLOSE_WAIT) {
if (Ethernet.socketRecvAvailable(i) > 0) {
EthernetClient client(i);
return client;
}
}
}
}
return EthernetClient();
}
size_t EthernetServer::write(uint8_t b)
{
return write(&b, 1);
}
size_t EthernetServer::write(const uint8_t *buffer, size_t size)
{
accept();
for (uint8_t i=0; i < MAX_SOCK_NUM; i++) {
if (server_port[i] == _port) {
if (Ethernet.socketStatus(i) == SnSR::ESTABLISHED) {
Ethernet.socketSend(i, buffer, size);
}
}
}
return size;
}