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