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 19:26:40 2013 +0000
Revision:
2:fe6ad47cd3eb
Parent:
1:35d97f58d4d9
Child:
3:91fa989f29e2
V4. RTOS handle multiple clients working

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 2:fe6ad47cd3eb 7 char buffer[256];
lemniskata 0:724a1b7b59ca 8
lemniskata 0:724a1b7b59ca 9 void Handle_client(void const *socket_data) {
lemniskata 2:fe6ad47cd3eb 10
lemniskata 0:724a1b7b59ca 11 int socket;
lemniskata 0:724a1b7b59ca 12 socket = (int)socket_data;
lemniskata 2:fe6ad47cd3eb 13 int n = lwip_recv(socket ,buffer,sizeof(buffer),0);
lemniskata 0:724a1b7b59ca 14
lemniskata 0:724a1b7b59ca 15
lemniskata 2:fe6ad47cd3eb 16 if (lwip_send(socket ,buffer,n,0)!=n) //send the content of the shared memory back to the socket
lemniskata 0:724a1b7b59ca 17 {
lemniskata 2:fe6ad47cd3eb 18
lemniskata 1:35d97f58d4d9 19
lemniskata 0:724a1b7b59ca 20 }
lemniskata 2:fe6ad47cd3eb 21
lemniskata 0:724a1b7b59ca 22
lemniskata 0:724a1b7b59ca 23 }
lemniskata 0:724a1b7b59ca 24
lemniskata 2:fe6ad47cd3eb 25 osThreadDef(Handle_client, osPriorityNormal, DEFAULT_STACK_SIZE);
lemniskata 2:fe6ad47cd3eb 26
lemniskata 0:724a1b7b59ca 27 int main (void) {
lemniskata 2:fe6ad47cd3eb 28
lemniskata 0:724a1b7b59ca 29 EthernetInterface eth;
lemniskata 0:724a1b7b59ca 30 eth.init(); //Use DHCP
lemniskata 0:724a1b7b59ca 31 eth.connect();
lemniskata 2:fe6ad47cd3eb 32 // Thread t1(Debug, (void *) 1);
lemniskata 1:35d97f58d4d9 33
lemniskata 2:fe6ad47cd3eb 34 int socket_server;
lemniskata 0:724a1b7b59ca 35 struct sockaddr_in localHost;
lemniskata 0:724a1b7b59ca 36 memset(&localHost, 0, sizeof(localHost));
lemniskata 0:724a1b7b59ca 37 int new_socket;
lemniskata 0:724a1b7b59ca 38
lemniskata 0:724a1b7b59ca 39 if( (socket_server= lwip_socket(AF_INET, SOCK_STREAM, 0))<0)
lemniskata 0:724a1b7b59ca 40 {
lemniskata 0:724a1b7b59ca 41 return -1;
lemniskata 0:724a1b7b59ca 42 }
lemniskata 0:724a1b7b59ca 43 localHost.sin_family = AF_INET;
lemniskata 0:724a1b7b59ca 44 localHost.sin_port = htons(SERVER_PORT);
lemniskata 0:724a1b7b59ca 45 localHost.sin_addr.s_addr = INADDR_ANY;
lemniskata 0:724a1b7b59ca 46
lemniskata 0:724a1b7b59ca 47 if (lwip_bind(socket_server, (const struct sockaddr *) &localHost, sizeof(localHost)) < 0) {
lemniskata 2:fe6ad47cd3eb 48
lemniskata 0:724a1b7b59ca 49 return -1;
lemniskata 0:724a1b7b59ca 50 }
lemniskata 0:724a1b7b59ca 51 if (lwip_listen(socket_server,3)<0)
lemniskata 0:724a1b7b59ca 52 {
lemniskata 0:724a1b7b59ca 53 perror("listen");
lemniskata 0:724a1b7b59ca 54 exit(EXIT_FAILURE);
lemniskata 0:724a1b7b59ca 55 }
lemniskata 0:724a1b7b59ca 56 socklen_t newSockRemoteHostLen = sizeof(localHost);
lemniskata 0:724a1b7b59ca 57 int tid;
lemniskata 0:724a1b7b59ca 58
lemniskata 0:724a1b7b59ca 59 for(tid=0;tid<=2;tid++)
lemniskata 0:724a1b7b59ca 60 {
lemniskata 0:724a1b7b59ca 61 new_socket = lwip_accept(socket_server, (struct sockaddr*) &localHost, &newSockRemoteHostLen);
lemniskata 0:724a1b7b59ca 62 if (new_socket < 0)
lemniskata 0:724a1b7b59ca 63 {
lemniskata 0:724a1b7b59ca 64 return -1;
lemniskata 2:fe6ad47cd3eb 65 }
lemniskata 0:724a1b7b59ca 66
lemniskata 2:fe6ad47cd3eb 67 osThreadCreate(osThread(Handle_client), (void *) new_socket);
lemniskata 2:fe6ad47cd3eb 68
lemniskata 2:fe6ad47cd3eb 69 }
lemniskata 0:724a1b7b59ca 70
lemniskata 0:724a1b7b59ca 71 }