From 70eecc1bafc85f7d589f913e00be1736821b4a15 Mon Sep 17 00:00:00 2001 From: isiora Date: Fri, 16 Mar 2018 18:31:51 +0000 Subject: Added multithread tcp client example. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11783 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c | 72 ++++++++++++++++---------- 1 file changed, 46 insertions(+), 26 deletions(-) (limited to 'demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c') diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c index 51200f054..4e816b741 100755 --- a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c @@ -26,13 +26,13 @@ #define SERVER_PORT_NUM 8080 #define SERVER_IP_ADDRESS "192.168.1.76" -void tcpexample(void) { +void tcpexample(int port) { int socket_fd; struct sockaddr_in ra; int recv_data; char data_buffer[80]; struct fd_set rset; - struct timeval tm = {5, 0}; + struct timeval tm = {10, 0}; /* * Creates an TCP socket, i.e. a SOCK_STREAM, with Internet Protocol Family, @@ -42,7 +42,7 @@ void tcpexample(void) { socket_fd = socket(PF_INET, SOCK_STREAM, 0); if ( socket_fd < 0 ) { - chprintf((BaseSequentialStream *)&SD1, "socket call failed"); + chprintf((BaseSequentialStream *)&SD1, "socket call failed.\r\n"); return; } @@ -52,41 +52,61 @@ void tcpexample(void) { memset(&ra, 0, sizeof(struct sockaddr_in)); ra.sin_family = AF_INET; ra.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS); - ra.sin_port = htons(SERVER_PORT_NUM); + ra.sin_port = htons(port); if (connect(socket_fd, (struct sockaddr *)&ra, sizeof (struct sockaddr_in)) < 0) { - chprintf((BaseSequentialStream *)&SD1, "connect failed \n"); + chprintf((BaseSequentialStream *)&SD1, "Connect failed.\r\n"); close(socket_fd); return; } - if (send(socket_fd, "A' sfugliatella e o' babà.\r\n", - sizeof "A' sfugliatella e o' babà.\r\n", 0) < 0) { - chprintf((BaseSequentialStream *)&SD1, "send failed \n"); - close(socket_fd); - return; - } - do { - FD_SET(socket_fd, &rset); - recv_data = select(socket_fd+1, &rset, 0, 0, &tm); + while (true) { + chsnprintf(data_buffer, sizeof data_buffer, + "Sending this message on port %d.\r\n", port); + if (send(socket_fd, data_buffer, strlen(data_buffer), 0) < 0) { + chprintf((BaseSequentialStream *)&SD1, "Send failed.\r\n"); + close(socket_fd); + return; + } + do { + FD_SET(socket_fd, &rset); + recv_data = select(socket_fd+1, &rset, 0, 0, &tm); + if (recv_data < 0) { + chprintf((BaseSequentialStream *)&SD1, "Select failed.\r\n"); + close(socket_fd); + return; + } + } while (recv_data == 0); + recv_data = recv(socket_fd, data_buffer, sizeof data_buffer, 0); if (recv_data < 0) { - chprintf((BaseSequentialStream *)&SD1, "select failed \n"); + chprintf((BaseSequentialStream *)&SD1, "Recv failed.\r\n"); close(socket_fd); return; } - } while (recv_data == 0); - recv_data = recv(socket_fd, data_buffer, sizeof data_buffer, 0); - if (recv_data < 0) { - chprintf((BaseSequentialStream *)&SD1, "recv failed \n"); - close(socket_fd); - return; + data_buffer[recv_data] = '\0'; + chprintf((BaseSequentialStream *)&SD1, "Received data: %s.\r\n", data_buffer); } - data_buffer[recv_data] = '\0'; - chprintf((BaseSequentialStream *)&SD1, "received data: %s\n",data_buffer); close(socket_fd); } +/* + * Two threads that run the same tcp example on two + * different ports. + */ +static THD_WORKING_AREA(waThreadTcp1, 512); +static THD_WORKING_AREA(waThreadTcp2, 512); +static THD_FUNCTION(ThreadTcp, arg) { + int port = (int)arg; + + tsWaitStubSkelReady(); + chThdSleepMilliseconds(5000); + while (true) { + tcpexample(port); + chThdSleepMilliseconds(250); + } +} + /* * LED blinker thread, times are in milliseconds. */ @@ -109,8 +129,6 @@ static THD_FUNCTION(Thread1, arg) { chThdSleepMilliseconds(160); palToggleLine(LINE_LED_BLUE); chThdSleepMilliseconds(600); - tcpexample(); - chThdSleepMilliseconds(5000); } } @@ -144,7 +162,9 @@ int main(void) { /* * Creates the blinker thread (and any other ancillary thread). */ - chThdCreateStatic(waThread1, sizeof waThread1, NORMALPRIO+10, Thread1, NULL); + chThdCreateStatic(waThread1, sizeof waThread1, NORMALPRIO, Thread1, NULL); + chThdCreateStatic(waThreadTcp1, sizeof waThreadTcp1, NORMALPRIO+10, ThreadTcp, (void *)8080); + chThdCreateStatic(waThreadTcp2, sizeof waThreadTcp2, NORMALPRIO+10, ThreadTcp, (void *)8081); /* * System initializations. -- cgit v1.2.3