当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Arduino Ethernet - server.accept()用法及代码示例


说明

传统的server.available()函数只会在发送数据后告诉你一个新的客户端,这使得FTP等一些协议无法正确实现。

目的是程序将使用available() 或accept(),但不能同时使用两者。使用available(),客户端连接继续由 EthernetServer 管理。您不需要保留客户端对象,因为调用 available() 将为您提供客户端发送的任何数据。使用available() 可以用很少的代码编写简单的服务器。

使用accept(),EthernetServer 只为您提供一次客户端,无论它是否已发送任何数据。您必须跟踪连接的客户端。这需要更多代码,但您可以获得更多控制权。

用法

server.accept()

参数

返回

  • 一个客户对象。如果没有客户端可以读取数据,则此对象将在 if-statement 中评估为 false。 (以太网客户端)。

示例

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 69, 104);

// telnet defaults to port 23
EthernetServer server(23);

EthernetClient clients[8];

void setup() {
  Ethernet.begin(mac, ip);

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start listening for clients
  server.begin();
}

void loop() {
  // check for any new client connecting, and say hello (before any incoming data)
  EthernetClient newClient = server.accept();
  if (newClient) {
    for (byte i = 0; i < 8; i++) {
      if (!clients[i]) {
        newClient.print("Hello, client number: ");
        newClient.println(i);
        // Once we "accept", the client is no longer tracked by EthernetServer
        // so we must store it into our list of clients
        clients[i] = newClient;
        break;
      }
    }
  }

  // check for incoming data from all clients
  for (byte i = 0; i < 8; i++) {
    while (clients[i] && clients[i].available() > 0) {
      // read incoming data from the client
      Serial.write(clients[i].read());
    }
  }

  // stop any clients which disconnect
  for (byte i = 0; i < 8; i++) {
    if (clients[i] && !clients[i].connected()) {
      clients[i].stop();
    }
  }
}

相关用法


注:本文由纯净天空筛选整理自arduino.cc大神的英文原创作品 Ethernet - server.accept()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。