int EthernetClient::connect(IPAddress ip, uint16_t port) { if (_sock != MAX_SOCK_NUM) return 0; for (int i = 0; i < MAX_SOCK_NUM; i++) { uint8_t s = socketStatus(i); if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT || s == SnSR::CLOSE_WAIT) { _sock = i; break; } } if (_sock == MAX_SOCK_NUM) return 0; _srcport++; if (_srcport == 0) _srcport = 49152; //Use IANA recommended ephemeral port range 49152-65535 socket(_sock, SnMR::TCP, _srcport, 0); if (!::connect(_sock, rawIPAddress(ip), port)) { _sock = MAX_SOCK_NUM; return 0; } while (status() != SnSR::ESTABLISHED) { delay(1); if (status() == SnSR::CLOSED) { _sock = MAX_SOCK_NUM; return 0; } } return 1; }
void AtlantikNetwork::writeData(QString msg) { emit networkEvent(msg, "1rightarrow"); msg.append("\n"); if (socketStatus() == KExtendedSocket::connected) *m_textStream << msg; else kdDebug() << "warning: socket not connected!" << endl; }
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 (socketStatus(i) == SnSR::ESTABLISHED) { socketSend(i, buffer, size); } } } return size; }
void EthernetServer::accept() { bool listening = false; if (sockindex < MAX_SOCK_NUM) { uint8_t status = socketStatus(sockindex); if (status == SnSR::LISTEN) { listening = true; } else if (status == SnSR::CLOSE_WAIT && socketRecvAvailable(sockindex) <= 0) { 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 = socketStatus(i); if (stat == SnSR::ESTABLISHED || stat == SnSR::CLOSE_WAIT) { if (socketRecvAvailable(i) > 0) { EthernetClient client(i); return client; } } } } return EthernetClient(); }
void AtlantikNetwork::slotRead() { if ( socketStatus() != KExtendedSocket::connected ) return; if (canReadLine()) { processMsg(m_textStream->readLine()); // There might be more data QTimer::singleShot(0, this, SLOT(slotRead())); } else { // Maximum message size. Messages won't get bigger than 32k anyway, so // if we didn't receive a newline by now, we probably won't anyway. if (bytesAvailable() > (1024 * 32)) flush(); } }
uint8_t EthernetClient::status() { if (_sock == MAX_SOCK_NUM) return SnSR::CLOSED; return socketStatus(_sock); }