TCP Server that handles multiple client requests at the same time using multiple threads

Dependencies:   EthernetInterface Server mbed-rtos mbed Threads

Committer:
lemniskata
Date:
Tue Jun 11 18:27:47 2013 +0000
Revision:
1:35d97f58d4d9
Parent:
0:724a1b7b59ca
Child:
2:fe6ad47cd3eb
v3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lemniskata 0:724a1b7b59ca 1 #include "mbed.h"
lemniskata 0:724a1b7b59ca 2 #include "EthernetInterface.h"
lemniskata 0:724a1b7b59ca 3
lemniskata 1:35d97f58d4d9 4 #define SERVER_PORT 7
lemniskata 0:724a1b7b59ca 5 #define BUFFLEN 100
lemniskata 0:724a1b7b59ca 6
lemniskata 0:724a1b7b59ca 7 int bufsize=1024; //Size of the shared memory
lemniskata 0:724a1b7b59ca 8 char *buffer; //This is the shared memory between the child threads
lemniskata 0:724a1b7b59ca 9
lemniskata 1:35d97f58d4d9 10 void Debug(void const *data)
lemniskata 1:35d97f58d4d9 11 {
lemniskata 1:35d97f58d4d9 12 TCPSocketServer server;
lemniskata 1:35d97f58d4d9 13 server.bind(SERVER_PORT);
lemniskata 1:35d97f58d4d9 14 server.listen();
lemniskata 1:35d97f58d4d9 15
lemniskata 1:35d97f58d4d9 16 while (true) {
lemniskata 1:35d97f58d4d9 17 printf("\nWait for new connection...\n");
lemniskata 1:35d97f58d4d9 18 TCPSocketConnection client;
lemniskata 1:35d97f58d4d9 19 server.accept(client);
lemniskata 1:35d97f58d4d9 20 client.set_blocking(false, 1500); // Timeout after (1.5)s
lemniskata 1:35d97f58d4d9 21
lemniskata 1:35d97f58d4d9 22 printf("Connection from: %s\n", client.get_address());
lemniskata 1:35d97f58d4d9 23 char buffer[256];
lemniskata 1:35d97f58d4d9 24 while (true) {
lemniskata 1:35d97f58d4d9 25 int n = client.receive(buffer, sizeof(buffer));
lemniskata 1:35d97f58d4d9 26 if (n <= 0) break;
lemniskata 1:35d97f58d4d9 27
lemniskata 1:35d97f58d4d9 28 client.send_all(buffer, n);
lemniskata 1:35d97f58d4d9 29 if (n <= 0) break;
lemniskata 1:35d97f58d4d9 30 }
lemniskata 1:35d97f58d4d9 31
lemniskata 1:35d97f58d4d9 32 client.close();
lemniskata 1:35d97f58d4d9 33 }
lemniskata 1:35d97f58d4d9 34 }
lemniskata 0:724a1b7b59ca 35 void Handle_client(void const *socket_data) {
lemniskata 0:724a1b7b59ca 36 int socket;
lemniskata 0:724a1b7b59ca 37 socket = (int)socket_data;
lemniskata 1:35d97f58d4d9 38 //pc.printf("Socket connected #%d\n",socket);
lemniskata 1:35d97f58d4d9 39
lemniskata 1:35d97f58d4d9 40 //pc.printf("Shared memory message is %s\n",buffer);
lemniskata 0:724a1b7b59ca 41 lwip_recv(socket,buffer,bufsize,0);
lemniskata 0:724a1b7b59ca 42
lemniskata 0:724a1b7b59ca 43
lemniskata 0:724a1b7b59ca 44 if (lwip_send(socket,buffer,strlen(buffer),0)!=strlen(buffer)) //send the content of the shared memory back to the socket
lemniskata 0:724a1b7b59ca 45 {
lemniskata 1:35d97f58d4d9 46 // pc.printf("failed send\n");
lemniskata 1:35d97f58d4d9 47
lemniskata 0:724a1b7b59ca 48 }
lemniskata 0:724a1b7b59ca 49
lemniskata 1:35d97f58d4d9 50 // pc.printf("Message sent successfully to socket %d\n",socket);
lemniskata 0:724a1b7b59ca 51
lemniskata 0:724a1b7b59ca 52 }
lemniskata 0:724a1b7b59ca 53
lemniskata 0:724a1b7b59ca 54 int main (void) {
lemniskata 0:724a1b7b59ca 55
lemniskata 0:724a1b7b59ca 56 EthernetInterface eth;
lemniskata 0:724a1b7b59ca 57 eth.init(); //Use DHCP
lemniskata 0:724a1b7b59ca 58 eth.connect();
lemniskata 1:35d97f58d4d9 59 Thread t1(Debug, (void *) 1);
lemniskata 1:35d97f58d4d9 60 while(1)
lemniskata 1:35d97f58d4d9 61 {
lemniskata 1:35d97f58d4d9 62
lemniskata 1:35d97f58d4d9 63 }
lemniskata 1:35d97f58d4d9 64 // pc.printf("IP Address is %s\n", eth.getIPAddress());
lemniskata 1:35d97f58d4d9 65 /*int socket_server;
lemniskata 0:724a1b7b59ca 66 struct sockaddr_in localHost;
lemniskata 0:724a1b7b59ca 67 memset(&localHost, 0, sizeof(localHost));
lemniskata 0:724a1b7b59ca 68 int new_socket;
lemniskata 0:724a1b7b59ca 69
lemniskata 0:724a1b7b59ca 70 if( (socket_server= lwip_socket(AF_INET, SOCK_STREAM, 0))<0)
lemniskata 0:724a1b7b59ca 71 {
lemniskata 1:35d97f58d4d9 72 // pc.printf("failed socket init\n");
lemniskata 0:724a1b7b59ca 73 return -1;
lemniskata 0:724a1b7b59ca 74 }
lemniskata 0:724a1b7b59ca 75 localHost.sin_family = AF_INET;
lemniskata 0:724a1b7b59ca 76 localHost.sin_port = htons(SERVER_PORT);
lemniskata 0:724a1b7b59ca 77 localHost.sin_addr.s_addr = INADDR_ANY;
lemniskata 0:724a1b7b59ca 78
lemniskata 0:724a1b7b59ca 79 if (lwip_bind(socket_server, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
lemniskata 1:35d97f58d4d9 80 // pc.printf("failed socket bind init\n");
lemniskata 0:724a1b7b59ca 81 return -1;
lemniskata 0:724a1b7b59ca 82 }
lemniskata 0:724a1b7b59ca 83 if (lwip_listen(socket_server,3)<0)
lemniskata 0:724a1b7b59ca 84 {
lemniskata 0:724a1b7b59ca 85 perror("listen");
lemniskata 0:724a1b7b59ca 86 exit(EXIT_FAILURE);
lemniskata 0:724a1b7b59ca 87 }
lemniskata 0:724a1b7b59ca 88 socklen_t newSockRemoteHostLen = sizeof(localHost);
lemniskata 0:724a1b7b59ca 89 int tid;
lemniskata 0:724a1b7b59ca 90
lemniskata 0:724a1b7b59ca 91 for(tid=0;tid<=2;tid++)
lemniskata 0:724a1b7b59ca 92 {
lemniskata 0:724a1b7b59ca 93 new_socket = lwip_accept(socket_server, (struct sockaddr*) &localHost, &newSockRemoteHostLen);
lemniskata 0:724a1b7b59ca 94 if (new_socket < 0)
lemniskata 0:724a1b7b59ca 95 {
lemniskata 1:35d97f58d4d9 96 // pc.printf("failed socket accept\n");
lemniskata 0:724a1b7b59ca 97 return -1;
lemniskata 0:724a1b7b59ca 98 }
lemniskata 0:724a1b7b59ca 99
lemniskata 0:724a1b7b59ca 100 Thread t(Handle_client, (void *) new_socket);
lemniskata 1:35d97f58d4d9 101 }*/
lemniskata 0:724a1b7b59ca 102
lemniskata 0:724a1b7b59ca 103 }