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 16:28:04 2013 +0000
Revision:
0:724a1b7b59ca
Child:
1:35d97f58d4d9
V2. Debug included, not tested

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 Serial pc(USBTX, USBRX);
lemniskata 0:724a1b7b59ca 4
lemniskata 0:724a1b7b59ca 5 #define SERVER_PORT 1234
lemniskata 0:724a1b7b59ca 6 #define BUFFLEN 100
lemniskata 0:724a1b7b59ca 7
lemniskata 0:724a1b7b59ca 8 int bufsize=1024; //Size of the shared memory
lemniskata 0:724a1b7b59ca 9 char *buffer; //This is the shared memory between the child threads
lemniskata 0:724a1b7b59ca 10
lemniskata 0:724a1b7b59ca 11 void Handle_client(void const *socket_data) {
lemniskata 0:724a1b7b59ca 12 int socket;
lemniskata 0:724a1b7b59ca 13 socket = (int)socket_data;
lemniskata 0:724a1b7b59ca 14 pc.printf("Socket connected #%d\n",socket);
lemniskata 0:724a1b7b59ca 15 // pthread_mutex_lock (&mutex);
lemniskata 0:724a1b7b59ca 16 pc.printf("Shared memory message is %s\n",buffer);
lemniskata 0:724a1b7b59ca 17 lwip_recv(socket,buffer,bufsize,0);
lemniskata 0:724a1b7b59ca 18
lemniskata 0:724a1b7b59ca 19
lemniskata 0:724a1b7b59ca 20 if (lwip_send(socket,buffer,strlen(buffer),0)!=strlen(buffer)) //send the content of the shared memory back to the socket
lemniskata 0:724a1b7b59ca 21 {
lemniskata 0:724a1b7b59ca 22 pc.printf("failed send\n");
lemniskata 0:724a1b7b59ca 23 }
lemniskata 0:724a1b7b59ca 24
lemniskata 0:724a1b7b59ca 25 pc.printf("Message sent successfully to socket %d\n",socket);
lemniskata 0:724a1b7b59ca 26
lemniskata 0:724a1b7b59ca 27 }
lemniskata 0:724a1b7b59ca 28
lemniskata 0:724a1b7b59ca 29 int main (void) {
lemniskata 0:724a1b7b59ca 30
lemniskata 0:724a1b7b59ca 31 EthernetInterface eth;
lemniskata 0:724a1b7b59ca 32 eth.init(); //Use DHCP
lemniskata 0:724a1b7b59ca 33 eth.connect();
lemniskata 0:724a1b7b59ca 34 pc.printf("IP Address is %s\n", eth.getIPAddress());
lemniskata 0:724a1b7b59ca 35 int socket_server;
lemniskata 0:724a1b7b59ca 36 struct sockaddr_in localHost;
lemniskata 0:724a1b7b59ca 37 memset(&localHost, 0, sizeof(localHost));
lemniskata 0:724a1b7b59ca 38 int new_socket;
lemniskata 0:724a1b7b59ca 39
lemniskata 0:724a1b7b59ca 40 if( (socket_server= lwip_socket(AF_INET, SOCK_STREAM, 0))<0)
lemniskata 0:724a1b7b59ca 41 {
lemniskata 0:724a1b7b59ca 42 pc.printf("failed socket init\n");
lemniskata 0:724a1b7b59ca 43 return -1;
lemniskata 0:724a1b7b59ca 44 }
lemniskata 0:724a1b7b59ca 45 localHost.sin_family = AF_INET;
lemniskata 0:724a1b7b59ca 46 localHost.sin_port = htons(SERVER_PORT);
lemniskata 0:724a1b7b59ca 47 localHost.sin_addr.s_addr = INADDR_ANY;
lemniskata 0:724a1b7b59ca 48
lemniskata 0:724a1b7b59ca 49 if (lwip_bind(socket_server, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
lemniskata 0:724a1b7b59ca 50 pc.printf("failed socket bind init\n");
lemniskata 0:724a1b7b59ca 51 return -1;
lemniskata 0:724a1b7b59ca 52 }
lemniskata 0:724a1b7b59ca 53 if (lwip_listen(socket_server,3)<0)
lemniskata 0:724a1b7b59ca 54 {
lemniskata 0:724a1b7b59ca 55 perror("listen");
lemniskata 0:724a1b7b59ca 56 exit(EXIT_FAILURE);
lemniskata 0:724a1b7b59ca 57 }
lemniskata 0:724a1b7b59ca 58 socklen_t newSockRemoteHostLen = sizeof(localHost);
lemniskata 0:724a1b7b59ca 59 int tid;
lemniskata 0:724a1b7b59ca 60
lemniskata 0:724a1b7b59ca 61 for(tid=0;tid<=2;tid++)
lemniskata 0:724a1b7b59ca 62 {
lemniskata 0:724a1b7b59ca 63 new_socket = lwip_accept(socket_server, (struct sockaddr*) &localHost, &newSockRemoteHostLen);
lemniskata 0:724a1b7b59ca 64 if (new_socket < 0)
lemniskata 0:724a1b7b59ca 65 {
lemniskata 0:724a1b7b59ca 66 pc.printf("failed socket accept\n");
lemniskata 0:724a1b7b59ca 67 return -1;
lemniskata 0:724a1b7b59ca 68 }
lemniskata 0:724a1b7b59ca 69
lemniskata 0:724a1b7b59ca 70 Thread t(Handle_client, (void *) new_socket);
lemniskata 0:724a1b7b59ca 71 }
lemniskata 0:724a1b7b59ca 72
lemniskata 0:724a1b7b59ca 73 }