aboutsummaryrefslogtreecommitdiffstats
path: root/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c
diff options
context:
space:
mode:
authorisiora <none@example.com>2018-03-16 18:31:51 +0000
committerisiora <none@example.com>2018-03-16 18:31:51 +0000
commit70eecc1bafc85f7d589f913e00be1736821b4a15 (patch)
treea2436cda1838e01260805a89a2bfa7d219656e27 /demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c
parent259f9cace1827a20d76c93a909b57e847d2ff9a0 (diff)
downloadChibiOS-70eecc1bafc85f7d589f913e00be1736821b4a15.tar.gz
ChibiOS-70eecc1bafc85f7d589f913e00be1736821b4a15.tar.bz2
ChibiOS-70eecc1bafc85f7d589f913e00be1736821b4a15.zip
Added multithread tcp client example.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11783 110e8d01-0319-4d1e-a829-52ad28d1bb01
Diffstat (limited to 'demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c')
-rwxr-xr-xdemos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-SEC/main.c72
1 files changed, 46 insertions, 26 deletions
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,42 +52,62 @@ 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.
*/
static THD_WORKING_AREA(waThread1, 512);
@@ -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.