For a question in forum this is a working example, there will be the example that is not working
Fork of eth_v13 by
TCPSocket.cpp@3:79dc3337d9da, 2014-03-21 (annotated)
- Committer:
- hggerdd
- Date:
- Fri Mar 21 00:18:33 2014 +0000
- Revision:
- 3:79dc3337d9da
- Parent:
- 2:8f5bacfef390
webserver;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hggerdd | 2:8f5bacfef390 | 1 | |
hggerdd | 2:8f5bacfef390 | 2 | #include "TCPSocket.h" |
hggerdd | 2:8f5bacfef390 | 3 | #include "ipaddr.h" |
hggerdd | 2:8f5bacfef390 | 4 | #include "w5100.h" |
hggerdd | 2:8f5bacfef390 | 5 | #include "mbed.h" |
hggerdd | 2:8f5bacfef390 | 6 | |
hggerdd | 2:8f5bacfef390 | 7 | extern Serial pc; |
hggerdd | 2:8f5bacfef390 | 8 | |
hggerdd | 2:8f5bacfef390 | 9 | TCPSocket::TCPSocket(int newSocket) |
hggerdd | 2:8f5bacfef390 | 10 | { |
hggerdd | 2:8f5bacfef390 | 11 | _socket = newSocket; |
hggerdd | 2:8f5bacfef390 | 12 | } |
hggerdd | 2:8f5bacfef390 | 13 | |
hggerdd | 3:79dc3337d9da | 14 | TCPSocket::TCPSocket() |
hggerdd | 3:79dc3337d9da | 15 | { |
hggerdd | 3:79dc3337d9da | 16 | } |
hggerdd | 3:79dc3337d9da | 17 | |
hggerdd | 3:79dc3337d9da | 18 | void TCPSocket::setSocket(int socket) |
hggerdd | 3:79dc3337d9da | 19 | { |
hggerdd | 3:79dc3337d9da | 20 | pc.printf("setSocket() = %d \n", _socket); |
hggerdd | 3:79dc3337d9da | 21 | _socket = socket; |
hggerdd | 3:79dc3337d9da | 22 | } |
hggerdd | 3:79dc3337d9da | 23 | |
hggerdd | 2:8f5bacfef390 | 24 | void TCPSocket::bind(int port) |
hggerdd | 2:8f5bacfef390 | 25 | { |
hggerdd | 3:79dc3337d9da | 26 | pc.printf("bind()= %d \n", _socket); |
hggerdd | 2:8f5bacfef390 | 27 | _port = port; |
hggerdd | 2:8f5bacfef390 | 28 | W5100.writeSnMR(_socket, SnMR::TCP); // set TCP mode |
hggerdd | 2:8f5bacfef390 | 29 | W5100.writeSnPORT(_socket, _port); |
hggerdd | 2:8f5bacfef390 | 30 | } |
hggerdd | 2:8f5bacfef390 | 31 | |
hggerdd | 2:8f5bacfef390 | 32 | void TCPSocket::listen() |
hggerdd | 2:8f5bacfef390 | 33 | { |
hggerdd | 3:79dc3337d9da | 34 | pc.printf("listen()= %d \n", _socket); |
hggerdd | 2:8f5bacfef390 | 35 | W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
hggerdd | 2:8f5bacfef390 | 36 | W5100.execCmdSn(_socket, Sock_LISTEN); // listen |
hggerdd | 2:8f5bacfef390 | 37 | } |
hggerdd | 2:8f5bacfef390 | 38 | |
hggerdd | 2:8f5bacfef390 | 39 | |
hggerdd | 2:8f5bacfef390 | 40 | |
hggerdd | 2:8f5bacfef390 | 41 | int TCPSocket::send(const char* buf, int len) |
hggerdd | 2:8f5bacfef390 | 42 | { |
hggerdd | 2:8f5bacfef390 | 43 | if (len > 0) { |
hggerdd | 2:8f5bacfef390 | 44 | W5100.send_data_processing(_socket, (uint8_t*)buf, len); |
hggerdd | 2:8f5bacfef390 | 45 | W5100.execCmdSn(_socket, Sock_SEND); |
hggerdd | 2:8f5bacfef390 | 46 | } |
hggerdd | 2:8f5bacfef390 | 47 | return len; |
hggerdd | 2:8f5bacfef390 | 48 | } |
hggerdd | 2:8f5bacfef390 | 49 | |
hggerdd | 2:8f5bacfef390 | 50 | int TCPSocket::recv(char* buf, int len) |
hggerdd | 2:8f5bacfef390 | 51 | { |
hggerdd | 2:8f5bacfef390 | 52 | int size = W5100.getRXReceivedSize(_socket); |
hggerdd | 2:8f5bacfef390 | 53 | if (size > len) { |
hggerdd | 2:8f5bacfef390 | 54 | size = len; |
hggerdd | 2:8f5bacfef390 | 55 | } |
hggerdd | 3:79dc3337d9da | 56 | |
hggerdd | 2:8f5bacfef390 | 57 | if (size > 0) { |
hggerdd | 2:8f5bacfef390 | 58 | W5100.recv_data_processing(_socket, (uint8_t*)buf, size); |
hggerdd | 2:8f5bacfef390 | 59 | W5100.execCmdSn(_socket, Sock_RECV); |
hggerdd | 2:8f5bacfef390 | 60 | } |
hggerdd | 2:8f5bacfef390 | 61 | |
hggerdd | 2:8f5bacfef390 | 62 | return size; |
hggerdd | 2:8f5bacfef390 | 63 | } |
hggerdd | 2:8f5bacfef390 | 64 | |
hggerdd | 2:8f5bacfef390 | 65 | void TCPSocket::poll() |
hggerdd | 2:8f5bacfef390 | 66 | { |
hggerdd | 3:79dc3337d9da | 67 | // status abfragen |
hggerdd | 2:8f5bacfef390 | 68 | uint8_t Sn_SR = W5100.readSnSR(_socket); |
hggerdd | 3:79dc3337d9da | 69 | pc.printf("(sock) SnSR = 0x%x\n", Sn_SR); |
hggerdd | 2:8f5bacfef390 | 70 | |
hggerdd | 2:8f5bacfef390 | 71 | switch(Sn_SR) { |
hggerdd | 3:79dc3337d9da | 72 | case SnSR::CLOSED: |
hggerdd | 3:79dc3337d9da | 73 | listen(); // wenn Socket geschlossen, dann öffnen |
hggerdd | 3:79dc3337d9da | 74 | break; |
hggerdd | 3:79dc3337d9da | 75 | |
hggerdd | 3:79dc3337d9da | 76 | case SnSR::LISTEN: // weiter warten |
hggerdd | 3:79dc3337d9da | 77 | break; |
hggerdd | 3:79dc3337d9da | 78 | |
hggerdd | 3:79dc3337d9da | 79 | case SnSR::ESTABLISHED: // Kontrolle, und App abarbeiten |
hggerdd | 3:79dc3337d9da | 80 | _callbackHandler.call(); |
hggerdd | 3:79dc3337d9da | 81 | break; |
hggerdd | 3:79dc3337d9da | 82 | |
hggerdd | 3:79dc3337d9da | 83 | case SnSR::FIN_WAIT: // für die folgenden Fälle den Port schließen |
hggerdd | 3:79dc3337d9da | 84 | case SnSR::CLOSING: |
hggerdd | 3:79dc3337d9da | 85 | case SnSR::TIME_WAIT: |
hggerdd | 3:79dc3337d9da | 86 | case SnSR::CLOSE_WAIT: |
hggerdd | 3:79dc3337d9da | 87 | case SnSR::LAST_ACK: |
hggerdd | 3:79dc3337d9da | 88 | close(); |
hggerdd | 3:79dc3337d9da | 89 | break; |
hggerdd | 3:79dc3337d9da | 90 | |
hggerdd | 3:79dc3337d9da | 91 | default: // Sonst --> nichts machen |
hggerdd | 2:8f5bacfef390 | 92 | break; |
hggerdd | 2:8f5bacfef390 | 93 | } |
hggerdd | 2:8f5bacfef390 | 94 | } |
hggerdd | 2:8f5bacfef390 | 95 | |
hggerdd | 2:8f5bacfef390 | 96 | void TCPSocket::close() |
hggerdd | 2:8f5bacfef390 | 97 | { |
hggerdd | 2:8f5bacfef390 | 98 | if (_socket != (-1)) { |
hggerdd | 2:8f5bacfef390 | 99 | W5100.execCmdSn(_socket, Sock_DISCON); |
hggerdd | 2:8f5bacfef390 | 100 | W5100.execCmdSn(_socket, Sock_CLOSE); |
hggerdd | 2:8f5bacfef390 | 101 | } |
hggerdd | 2:8f5bacfef390 | 102 | } |
hggerdd | 2:8f5bacfef390 | 103 | |
hggerdd | 2:8f5bacfef390 | 104 | void TCPSocket::setOnEvent(void (*pMethod)(void)) |
hggerdd | 2:8f5bacfef390 | 105 | { |
hggerdd | 2:8f5bacfef390 | 106 | m_pCb = pMethod; |
hggerdd | 3:79dc3337d9da | 107 | pointertype = 0; |
hggerdd | 2:8f5bacfef390 | 108 | } |
hggerdd | 3:79dc3337d9da | 109 | |
hggerdd | 3:79dc3337d9da | 110 | int TCPSocket::getRxSize() |
hggerdd | 3:79dc3337d9da | 111 | { |
hggerdd | 3:79dc3337d9da | 112 | return W5100.readSnRX_RSR(_socket); |
hggerdd | 3:79dc3337d9da | 113 | } |