TCP/IP based digital io controller for operating DigitalsOuts and reading DigitalIns.

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of NetRelais by Roy van Dam

Committer:
NegativeBlack
Date:
Wed Jul 18 18:45:57 2012 +0000
Revision:
9:a4c85bea2d77
Parent:
8:d55cac25e637
Child:
10:22d49341340c
TCP Server Example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:bb128f0e952f 1 #include "mbed.h"
donatien 0:bb128f0e952f 2 #include "EthernetInterface.h"
donatien 0:bb128f0e952f 3
NegativeBlack 9:a4c85bea2d77 4 #include "NetworkAPI/buffer.hpp"
NegativeBlack 9:a4c85bea2d77 5 #include "NetworkAPI/select.hpp"
NegativeBlack 6:33b57f606f2b 6 #include "NetworkAPI/ip/address.hpp"
NegativeBlack 9:a4c85bea2d77 7 #include "NetworkAPI/tcp/socket.hpp"
NegativeBlack 9:a4c85bea2d77 8 using namespace network;
NegativeBlack 9:a4c85bea2d77 9
NegativeBlack 9:a4c85bea2d77 10 #define MAX_CLIENTS 5
donatien 0:bb128f0e952f 11
NegativeBlack 6:33b57f606f2b 12 int
NegativeBlack 6:33b57f606f2b 13 main()
NegativeBlack 6:33b57f606f2b 14 {
NegativeBlack 6:33b57f606f2b 15 EthernetInterface interface;
NegativeBlack 6:33b57f606f2b 16 interface.init();
NegativeBlack 6:33b57f606f2b 17 interface.connect();
NegativeBlack 6:33b57f606f2b 18 printf("IP Address is %s\n\r", interface.getIPAddress());
NegativeBlack 9:a4c85bea2d77 19
NegativeBlack 9:a4c85bea2d77 20 Select select;
NegativeBlack 9:a4c85bea2d77 21 tcp::Socket server;
NegativeBlack 9:a4c85bea2d77 22 tcp::Socket client[MAX_CLIENTS];
NegativeBlack 9:a4c85bea2d77 23 tcp::Socket *socket = NULL;
NegativeBlack 9:a4c85bea2d77 24
NegativeBlack 8:d55cac25e637 25 int result = 0;
NegativeBlack 9:a4c85bea2d77 26 int index = 0;
NegativeBlack 8:d55cac25e637 27
NegativeBlack 9:a4c85bea2d77 28 network::Buffer buffer(256);
NegativeBlack 9:a4c85bea2d77 29 std::string message("Hello world!");
NegativeBlack 8:d55cac25e637 30
NegativeBlack 9:a4c85bea2d77 31 // Configure the server socket (assume everty thing works)
NegativeBlack 9:a4c85bea2d77 32 server.open();
NegativeBlack 9:a4c85bea2d77 33 server.bind(1234);
NegativeBlack 9:a4c85bea2d77 34 server.listen(MAX_CLIENTS);
NegativeBlack 9:a4c85bea2d77 35
NegativeBlack 9:a4c85bea2d77 36 // Add sockets to the select api
NegativeBlack 9:a4c85bea2d77 37 select.set(&server, Select::Read);
NegativeBlack 9:a4c85bea2d77 38 for (index = 0; index < MAX_CLIENTS; index++) {
NegativeBlack 9:a4c85bea2d77 39 select.set(&client[index], Select::Read);
NegativeBlack 8:d55cac25e637 40 }
donatien 0:bb128f0e952f 41
NegativeBlack 9:a4c85bea2d77 42 do {
NegativeBlack 9:a4c85bea2d77 43 // Wait for activity
NegativeBlack 9:a4c85bea2d77 44 result = select.wait();
NegativeBlack 9:a4c85bea2d77 45 if (result < -1) {
NegativeBlack 9:a4c85bea2d77 46 printf("Failed to select\n\r");
NegativeBlack 9:a4c85bea2d77 47 break;
NegativeBlack 9:a4c85bea2d77 48 }
NegativeBlack 9:a4c85bea2d77 49
NegativeBlack 9:a4c85bea2d77 50 // Get the first socket
NegativeBlack 9:a4c85bea2d77 51 socket = (tcp::Socket *)select.getReadable();
NegativeBlack 8:d55cac25e637 52
NegativeBlack 9:a4c85bea2d77 53 for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) {
NegativeBlack 9:a4c85bea2d77 54 // Check if there was a connection request.
NegativeBlack 9:a4c85bea2d77 55 if (socket->getHandle() == server.getHandle()) {
NegativeBlack 9:a4c85bea2d77 56 // Find an unused client
NegativeBlack 9:a4c85bea2d77 57 for (index = 0; index < MAX_CLIENTS; index++) {
NegativeBlack 9:a4c85bea2d77 58 if (client[index].getStatus() == Socket::Closed) {
NegativeBlack 9:a4c85bea2d77 59 break;
NegativeBlack 9:a4c85bea2d77 60 }
NegativeBlack 9:a4c85bea2d77 61 }
NegativeBlack 9:a4c85bea2d77 62
NegativeBlack 9:a4c85bea2d77 63 // Maximum connections reached
NegativeBlack 9:a4c85bea2d77 64 if (index == MAX_CLIENTS) {
NegativeBlack 9:a4c85bea2d77 65 printf("Maximum connections reached\n\r");
NegativeBlack 9:a4c85bea2d77 66 continue;
NegativeBlack 9:a4c85bea2d77 67 }
NegativeBlack 8:d55cac25e637 68
NegativeBlack 9:a4c85bea2d77 69 // Accept the client
NegativeBlack 9:a4c85bea2d77 70 socket->accept(client[index]);
NegativeBlack 9:a4c85bea2d77 71 printf("Client connected %s:%d\n\r",
NegativeBlack 9:a4c85bea2d77 72 client[index].getRemoteEndpoint().getAddress().toString().c_str(),
NegativeBlack 9:a4c85bea2d77 73 client[index].getRemoteEndpoint().getPort());
NegativeBlack 9:a4c85bea2d77 74
NegativeBlack 9:a4c85bea2d77 75 // Send a nice message to the client
NegativeBlack 9:a4c85bea2d77 76 client[index].write((void *)message.data(), message.size());
NegativeBlack 9:a4c85bea2d77 77 continue;
NegativeBlack 9:a4c85bea2d77 78 }
NegativeBlack 9:a4c85bea2d77 79
NegativeBlack 9:a4c85bea2d77 80 // It was not the server socket, so it must be a client talking to us.
NegativeBlack 9:a4c85bea2d77 81 switch (socket->read(buffer)) {
NegativeBlack 9:a4c85bea2d77 82 case 0:
NegativeBlack 9:a4c85bea2d77 83 // Remote end disconnected
NegativeBlack 9:a4c85bea2d77 84 printf("Client disconnected %s:%d\n\r",
NegativeBlack 9:a4c85bea2d77 85 socket->getRemoteEndpoint().getAddress().toString().c_str(),
NegativeBlack 9:a4c85bea2d77 86 socket->getRemoteEndpoint().getPort());
NegativeBlack 9:a4c85bea2d77 87
NegativeBlack 9:a4c85bea2d77 88 // Close socket
NegativeBlack 9:a4c85bea2d77 89 socket->close();
NegativeBlack 9:a4c85bea2d77 90 break;
NegativeBlack 8:d55cac25e637 91
NegativeBlack 9:a4c85bea2d77 92 case -1:
NegativeBlack 9:a4c85bea2d77 93 printf("Error while reading data from socket\n\r");
NegativeBlack 9:a4c85bea2d77 94 socket->close();
NegativeBlack 9:a4c85bea2d77 95 break;
NegativeBlack 9:a4c85bea2d77 96
NegativeBlack 9:a4c85bea2d77 97 default:
NegativeBlack 9:a4c85bea2d77 98 printf("Message from %s:%d\n\r",
NegativeBlack 9:a4c85bea2d77 99 socket->getRemoteEndpoint().getAddress().toString().c_str(),
NegativeBlack 9:a4c85bea2d77 100 socket->getRemoteEndpoint().getPort());
NegativeBlack 9:a4c85bea2d77 101
NegativeBlack 9:a4c85bea2d77 102 printf("%s\n\r", (char *)buffer.pointer());
NegativeBlack 9:a4c85bea2d77 103 break;
NegativeBlack 9:a4c85bea2d77 104 }
NegativeBlack 9:a4c85bea2d77 105 }
NegativeBlack 9:a4c85bea2d77 106
NegativeBlack 9:a4c85bea2d77 107 } while (server.getStatus() == Socket::Listening);
NegativeBlack 6:33b57f606f2b 108 }