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