TCP Server that handles multiple client requests at the same time using multiple threads
Dependencies: EthernetInterface Server mbed-rtos mbed Threads
main.cpp@2:fe6ad47cd3eb, 2013-06-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |