⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpp.nc

📁 tinyos-2.x.rar
💻 NC
字号:

#include <table.h>
#include <ip.h>

module TcpP {
  provides interface Tcp[uint8_t client];
  provides interface Init;
  uses {
    interface Boot;

    interface IP;    
    interface Timer<TMilli>;
    interface IPAddress;
  }
} implementation {

  enum {
    N_CLIENTS = uniqueCount("TCP_CLIENT"),
  };

#include <tcplib.h>
  struct tcplib_sock socks[N_CLIENTS];

  int find_client(struct tcplib_sock *conn) {
    int i;
    for (i = 0; i < N_CLIENTS; i++)
      if (&socks[i] == conn) break;

    return i;
  }

  void tcplib_extern_connectdone(struct tcplib_sock *sock, int error) {
    int cid = find_client(sock);
    if (cid < N_CLIENTS)
      signal Tcp.connectDone[cid](error == 0);
  }

  void tcplib_extern_recv(struct tcplib_sock *sock, void *data, int len) {
    int cid = find_client(sock);
    if (cid < N_CLIENTS)
      signal Tcp.recv[cid](data, len);
  }

  void tcplib_extern_closed(struct tcplib_sock *sock) {
    tcplib_close(sock);
  }

  void tcplib_extern_closedone(struct tcplib_sock *sock) {
    int cid = find_client(sock);
    tcplib_init_sock(sock);
    if (cid < N_CLIENTS)
      signal Tcp.closed[cid](0);
  }

  void tcplib_extern_acked(struct tcplib_sock *sock) {
    int cid = find_client(sock);
    if (cid < N_CLIENTS)
      signal Tcp.acked[cid]();
  }
#include "circ.c"
#include "tcplib.c"

  struct tcplib_sock socks[uniqueCount("TCP_CLIENT")];

  struct tcplib_sock *tcplib_accept(struct tcplib_sock *conn,
                                    struct sockaddr_in6 *from) {
    int cid = find_client(conn);

    printfUART("tcplib_accept: cid: %i\n", cid);

    if (cid == N_CLIENTS) return NULL;
    if (signal Tcp.accept[cid](from, &conn->tx_buf, &conn->tx_buf_len)) {
      if (conn->tx_buf == NULL) return NULL;
      return conn;
    }
    return NULL;
  }

  void tcplib_send_out(struct split_ip_msg *msg, struct tcp_hdr *tcph) {
    printfUART("tcp output\n");
    call IPAddress.setSource(&msg->hdr);
    tcph->chksum = htons(msg_cksum(msg, IANA_TCP));
    call IP.send(msg);
  }

  command error_t Init.init() {
    int i;
    for (i = 0; i < uniqueCount("TCP_CLIENT"); i++) {
      tcplib_init_sock(&socks[i]);
    }
    return SUCCESS;
  }

  event void Boot.booted() {
    call Timer.startPeriodic(512);
  }

  event void Timer.fired() {
    tcplib_timer_process();
  }

  event void IP.recv(struct ip6_hdr *iph, 
                     void *payload, 
                     struct ip_metadata *meta) {
    
    printfUART("tcp packet received\n");
    tcplib_process(iph, payload);
  }


  command error_t Tcp.bind[uint8_t client](uint16_t port) {
    struct sockaddr_in6 addr;
    ip_memclr(addr.sin6_addr.s6_addr, 16);
    addr.sin6_port = htons(port);
    tcplib_bind(&socks[client], &addr);
    return SUCCESS;
  }

  command error_t Tcp.connect[uint8_t client](struct sockaddr_in6 *dest,
                                              void *tx_buf, int tx_buf_len) {
    socks[client].tx_buf = tx_buf;
    socks[client].tx_buf_len = tx_buf_len;
    tcplib_connect(&socks[client], dest);
  }

  command error_t Tcp.send[uint8_t client](void *payload, uint16_t len) {
    if (tcplib_send(&socks[client], payload, len) < 0) return FAIL;
    return SUCCESS;
  }
  
  command error_t Tcp.close[uint8_t client]() {
    if (!tcplib_close(&socks[client]))
      return SUCCESS;
    return FAIL;
  }

  command error_t Tcp.abort[uint8_t client]() {
    if (tcplib_abort(&socks[client]) < 0) return FAIL;
    return SUCCESS;
  }

  default event bool Tcp.accept[uint8_t cid](struct sockaddr_in6 *from, 
                                             void **tx_buf, int *tx_buf_len) {
    return FALSE;
  }

 default event void Tcp.connectDone[uint8_t cid](error_t e) {}
 default event void Tcp.recv[uint8_t cid](void *payload, uint16_t len) {  }
 default event void Tcp.closed[uint8_t cid](error_t e) { }
 default event void Tcp.acked[uint8_t cid]() { }
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -