A basic example of two treads for TCP and UDP. The TCP server in its thread waiting for a command (!start or !stop) from a client. That control the UDP thread and it start or stop sending a dummy message.
main.cpp
- Committer:
- JohnnyK
- Date:
- 2020-05-29
- Revision:
- 1:191f7e703c43
- Parent:
- 0:d54540de63d4
File content as of revision 1:191f7e703c43:
#include "mbed.h" //MbedOS 5.15 on Nucleo-F767ZI #include "NetworkInterface.h" #define BUFFSIZE 50 #define ROUTER #ifndef ROUTER #define IP "192.168.1.1" //Here place your Static IP of Mbed, when you want it to connect directly to PC #define GATEWAY "0.0.0.0" #define MASK "255.255.255.0" #endif #define ADDRESS "192.168.1.10" /*Here place IP of your PC. Run cmd.exe and write command ipconfig. If the address will be incorrect, the first message will be lost and connection will be established with first received message from opposite side.*/ #define UDPPORT 20 #define UDPREMOTEPORT 2000 #define TCPPORT 80 DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); Thread threadUDP; Thread threadTCP; Ticker ticker; NetworkInterface *net = NetworkInterface::get_default_instance(); SocketAddress ip; volatile bool startFlag = false; volatile int dummyValue = 0; void tickerFunc(); void taskTCP(); void taskUDP(); int main() { printf("Example of UDP and TCP at once\n"); int net_stat; #ifndef ROUTER net->disconnect(); net_stat = net->set_network((SocketAddress)IP,(SocketAddress)MASK,(SocketAddress)GATEWAY); printf("Network set IP status: %s\n", net_stat ? "Error": "OK"); #endif printf("Connecting..."); net_stat = net->connect(); printf("%s\n",net_stat ? "Error": "OK"); net->get_ip_address(&ip); const char *p_ip = ip.get_ip_address(); printf("Device IP address: %s\n", p_ip ? p_ip : "None"); if(ip){ SocketAddress mask; net->get_netmask(&mask); const char *p_mask = mask.get_ip_address(); printf("Netmask: %s\n", p_mask ? p_mask : "None"); SocketAddress gateway; net->get_gateway(&gateway); const char *p_gateway = gateway.get_ip_address(); printf("Gateway: %s\n", p_gateway ? p_gateway : "None"); ticker.attach(&tickerFunc, 1); printf("Starting of TCP and UDP threads...\n"); ThisThread::sleep_for(200); threadUDP.start(callback(taskUDP)); ThisThread::sleep_for(200); threadTCP.start(callback(taskTCP)); ThisThread::sleep_for(200); }else{ printf("No IP\n"); if(net != nullptr) net->disconnect(); printf("Program End\n"); } while(1) { led1 =! led1; ThisThread::sleep_for(1000); } } void tickerFunc(){ dummyValue = rand() % 100; //random 0-99 } void taskTCP(){ printf("TCP Server starting...\n"); TCPSocket server; TCPSocket *client; SocketAddress clientAddress; char in_buffer[BUFFSIZE]; const char *selection[] = {"!stop","!start"}; server.open(net); server.bind(TCPPORT); server.listen(1); printf("TCP Server bound and listening at port: %d\n", TCPPORT); while (1) { client = server.accept(); client->getpeername(&clientAddress); const char *p_clientAddress = clientAddress.get_ip_address(); printf("Client connected from IP address: %s\n", p_clientAddress ? p_clientAddress : "None"); bool b = true; while (b) { led2 =! led2; int n = client->recv(in_buffer, BUFFSIZE); if (n == 0) { printf("Client disconnected\n"); b = false; }else{ in_buffer[n] = '\0'; char *result = nullptr; for(int i = 0; i<2; i++){ result = strstr(in_buffer,selection[i]); if(result != nullptr){ startFlag = i; break; } } printf("Received message from Client :'%s'\n", in_buffer); } } client->close(); } server.close(); printf("Thread end\n"); } void taskUDP(){ printf("UDP starting...\n"); UDPSocket sock; SocketAddress addr; SocketAddress targetAddr(ADDRESS,UDPREMOTEPORT); sock.open(net); sock.bind(UDPPORT); printf("UDP listens on the local port: %d and send to the remote port %d\n", UDPPORT, UDPREMOTEPORT); char buffer[BUFFSIZE]; while(1){ while(!startFlag) ThisThread::sleep_for(100); sprintf(buffer,"Dummy value %d\n",dummyValue); sock.sendto(targetAddr, buffer, sizeof(buffer)); printf("Send back: %s", buffer); led3 =! led3; ThisThread::sleep_for(500); } }