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

Dependents:   ThreadServer Server_Multi_Client

Committer:
lemniskata
Date:
Sat Jun 29 23:21:20 2013 +0000
Revision:
4:c57a998796ae
Parent:
1:e1db78d5ccc1
Multi Client server. Handles multiple clients at the same time in different threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lemniskata 1:e1db78d5ccc1 1 /*
lemniskata 1:e1db78d5ccc1 2 ** File name: Server.cpp
lemniskata 1:e1db78d5ccc1 3 ** Descriptions: TCP server that handles multiple client requests in separate threads
lemniskata 1:e1db78d5ccc1 4 **
lemniskata 1:e1db78d5ccc1 5 **------------------------------------------------------------------------------------------------------
lemniskata 1:e1db78d5ccc1 6 ** Created by: Ivan Shindev
lemniskata 1:e1db78d5ccc1 7 ** Created date: 06/11/2013
lemniskata 1:e1db78d5ccc1 8 ** Version: 1.0
lemniskata 1:e1db78d5ccc1 9 ** Descriptions: The original version
lemniskata 1:e1db78d5ccc1 10 **
lemniskata 1:e1db78d5ccc1 11 **------------------------------------------------------------------------------------------------------
lemniskata 4:c57a998796ae 12 ** Modified by: Ivan Shindev
lemniskata 4:c57a998796ae 13 ** Modified date: 06/29/2013
lemniskata 1:e1db78d5ccc1 14 ** Version:
lemniskata 4:c57a998796ae 15 ** Descriptions: Added functionality of running multiple thread instances of the same function
lemniskata 1:e1db78d5ccc1 16 ********************************************************************************************************/
lemniskata 0:a5fdd089d5c6 17 #include "Server.h"
lemniskata 0:a5fdd089d5c6 18
lemniskata 0:a5fdd089d5c6 19 #include "mbed.h"
lemniskata 4:c57a998796ae 20 #include "Threads.h"
lemniskata 1:e1db78d5ccc1 21 /*Handle_client handles the client request
lemniskata 1:e1db78d5ccc1 22 *
lemniskata 1:e1db78d5ccc1 23 * Default: Echo the clients request
lemniskata 1:e1db78d5ccc1 24 */
lemniskata 0:a5fdd089d5c6 25
lemniskata 0:a5fdd089d5c6 26 void Handle_client(void const *socket_data) {
lemniskata 0:a5fdd089d5c6 27
lemniskata 0:a5fdd089d5c6 28 int socket;
lemniskata 0:a5fdd089d5c6 29 char buffer[256];
lemniskata 0:a5fdd089d5c6 30 socket = (int)socket_data;
lemniskata 1:e1db78d5ccc1 31
lemniskata 1:e1db78d5ccc1 32 int n = lwip_recv(socket ,buffer,sizeof(buffer),0); //read from the client
lemniskata 0:a5fdd089d5c6 33
lemniskata 1:e1db78d5ccc1 34 if (lwip_send(socket ,buffer,n,0)!=n) //send the content back to the socket
lemniskata 0:a5fdd089d5c6 35 {
lemniskata 0:a5fdd089d5c6 36
lemniskata 0:a5fdd089d5c6 37
lemniskata 0:a5fdd089d5c6 38 }
lemniskata 0:a5fdd089d5c6 39
lemniskata 0:a5fdd089d5c6 40
lemniskata 0:a5fdd089d5c6 41 }
lemniskata 0:a5fdd089d5c6 42
lemniskata 0:a5fdd089d5c6 43
lemniskata 0:a5fdd089d5c6 44 Server::Server(int port, int max_number_of_clients):
lemniskata 0:a5fdd089d5c6 45 _port(port), _max_number_of_clients(max_number_of_clients){
lemniskata 0:a5fdd089d5c6 46
lemniskata 0:a5fdd089d5c6 47
lemniskata 0:a5fdd089d5c6 48 }
lemniskata 0:a5fdd089d5c6 49
lemniskata 0:a5fdd089d5c6 50 int Server::Start() {
lemniskata 0:a5fdd089d5c6 51
lemniskata 0:a5fdd089d5c6 52 EthernetInterface eth;
lemniskata 0:a5fdd089d5c6 53 eth.init(); //Use DHCP
lemniskata 0:a5fdd089d5c6 54 eth.connect();
lemniskata 0:a5fdd089d5c6 55
lemniskata 0:a5fdd089d5c6 56 int socket_server;
lemniskata 0:a5fdd089d5c6 57 struct sockaddr_in localHost;
lemniskata 0:a5fdd089d5c6 58 memset(&localHost, 0, sizeof(localHost));
lemniskata 0:a5fdd089d5c6 59 int new_socket;
lemniskata 0:a5fdd089d5c6 60
lemniskata 0:a5fdd089d5c6 61 if( (socket_server= lwip_socket(AF_INET, SOCK_STREAM, 0))<0)
lemniskata 0:a5fdd089d5c6 62 {
lemniskata 0:a5fdd089d5c6 63 return -1;
lemniskata 0:a5fdd089d5c6 64 }
lemniskata 0:a5fdd089d5c6 65 localHost.sin_family = AF_INET;
lemniskata 1:e1db78d5ccc1 66 localHost.sin_port = htons(_port); //port
lemniskata 1:e1db78d5ccc1 67 localHost.sin_addr.s_addr = INADDR_ANY; //localhost address
lemniskata 0:a5fdd089d5c6 68
lemniskata 0:a5fdd089d5c6 69 if (lwip_bind(socket_server, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
lemniskata 0:a5fdd089d5c6 70
lemniskata 0:a5fdd089d5c6 71 return -1;
lemniskata 0:a5fdd089d5c6 72 }
lemniskata 0:a5fdd089d5c6 73 if (lwip_listen(socket_server,3)<0)
lemniskata 0:a5fdd089d5c6 74 {
lemniskata 0:a5fdd089d5c6 75
lemniskata 0:a5fdd089d5c6 76 perror("listen");
lemniskata 0:a5fdd089d5c6 77 exit(EXIT_FAILURE);
lemniskata 0:a5fdd089d5c6 78 }
lemniskata 0:a5fdd089d5c6 79
lemniskata 0:a5fdd089d5c6 80 socklen_t newSockRemoteHostLen = sizeof(localHost);
lemniskata 4:c57a998796ae 81
lemniskata 4:c57a998796ae 82 ThreadList* my_threads=NULL; //List of all Initialized threads
lemniskata 4:c57a998796ae 83 ThreadList* thread; //pointer to the last created ThreadList element
lemniskata 4:c57a998796ae 84 int max=_max_number_of_clients;
lemniskata 4:c57a998796ae 85 while(1)
lemniskata 0:a5fdd089d5c6 86 {
lemniskata 0:a5fdd089d5c6 87 new_socket = lwip_accept(socket_server, (struct sockaddr*) &localHost, &newSockRemoteHostLen);
lemniskata 0:a5fdd089d5c6 88 if (new_socket < 0)
lemniskata 0:a5fdd089d5c6 89 {
lemniskata 4:c57a998796ae 90
lemniskata 4:c57a998796ae 91 }
lemniskata 4:c57a998796ae 92 else
lemniskata 4:c57a998796ae 93 {
lemniskata 4:c57a998796ae 94
lemniskata 4:c57a998796ae 95 if(initThread(&my_threads,Handle_client,&thread,max)==0)
lemniskata 4:c57a998796ae 96 {
lemniskata 4:c57a998796ae 97 lwip_close(new_socket);
lemniskata 4:c57a998796ae 98
lemniskata 4:c57a998796ae 99 }
lemniskata 4:c57a998796ae 100 else
lemniskata 4:c57a998796ae 101 {
lemniskata 4:c57a998796ae 102
lemniskata 4:c57a998796ae 103 thread->id=osThreadCreate(thread->thread,(void *) new_socket);
lemniskata 4:c57a998796ae 104
lemniskata 4:c57a998796ae 105 }
lemniskata 0:a5fdd089d5c6 106 }
lemniskata 0:a5fdd089d5c6 107
lemniskata 0:a5fdd089d5c6 108
lemniskata 0:a5fdd089d5c6 109 }
lemniskata 0:a5fdd089d5c6 110 }
lemniskata 0:a5fdd089d5c6 111
lemniskata 0:a5fdd089d5c6 112