9
0
Fork 0

Add host side helper for poll test

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@1284 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2008-11-19 00:23:38 +00:00
parent 83ea27d5dc
commit 4dc2300fcb
3 changed files with 283 additions and 1 deletions

View File

@ -100,7 +100,42 @@ examples/poll
A test of the poll() and select() APIs using FIFOs and, if available,
stdin, and a TCP/IP socket. This example also includes a nice select
based TCP/IP server example.
based TCP/IP server example. In order to build this test, you must the
following selected in your NuttX configuration file:
CONFIG_NFILE_DESCRIPTORS - Defined to be greater than 0
CONFIG_DISABLE_POLL - NOT defined
In order to use the TCP/IP select test, you have also the following
additional things selected in your NuttX configuration file:
CONFIG_NET - Defined for general network support
CONFIG_NET_TCP - Defined for TCP/IP support
CONFIG_NSOCKET_DESCRIPTORS - Defined to be greater than 0
CONFIG_NET_NTCP_READAHEAD_BUFFERS - Defined to be greater than zero
In additional to the target device-side example, there is also
a host-side application in this directory. It can be compiled under
Linux or Cygwin as follows:
cd examples/usbserial
make -f Makefile.host TOPDIR=../../. TARGETIP=<target-ip>
Where <target-ip> is the IP address of your target board.
This will generate a small program called 'host'. Usage:
1. Build the examples/poll target program with TCP/IP poll support
and start the target.
3. Then start the host application:
./host
The host and target will exchange are variety of small messages. Each
message sent from the host should cause the select to return in target.
The target example should read the small message and send it back to
the host. The host should then receive the echo'ed message.
examples/romfs
^^^^^^^^^^^^^^
@ -157,6 +192,36 @@ examples/usbserial
CONFIG_EXAMPLES_USBSERIAL_ONLYBIG
Send only large, multi-packet messages. Default: Send large and small.
In additional to the target device-side example, there is also
a host-side application in this directory. It can be compiled under
Linux or Cygwin as follows:
cd examples/usbserial
make -f Makefile.host TOPDIR=../../.
This will generate a small program called 'host'. Usage:
1. Build the examples/usbserial target program and start the target.
2. Wait a bit, then do enter:
dmesg
At the end of the dmesg output, you should see the the seria
device was successfully idenfied and assigned to a tty device,
probably /dev/ttyUSB0.
3. Then start the host application:
./host [<tty-dev>]
Where:
<tty-dev> is the USB TTY device to use. The default is /dev/ttyUSB0.
The host and target will exchange are variety of very small and very large
serial messages.
examples/usbstorage
^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,51 @@
############################################################################
# examples/poll/Makefile.host
#
# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
include $(TOPDIR)/.config
include $(TOPDIR)/Make.defs
SRC = host.c
BIN = host
DEFINES = -DTARGETIP=\"$(TARGETIP)\"
all: $(BIN)$(EXEEXT)
$(BIN)$(EXEEXT): $(SRC)
$(HOSTCC) $(HOSTCFLAGS) $(DEFINES) $^ -o $@
clean:
@rm -f $(BIN) *~ .*.swp *.o
$(call CLEAN)

166
nuttx/examples/poll/host.c Normal file
View File

@ -0,0 +1,166 @@
/****************************************************************************
* examples/poll/host.c
*
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define pthread_addr_t void *
#include "poll_internal.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#ifndef TARGETIP
# error TARGETIP not defined
#endif
#define IOBUFFER_SIZE 80
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* main
****************************************************************************/
int main(int argc, char **argv, char **envp)
{
struct sockaddr_in myaddr;
char outbuf[IOBUFFER_SIZE];
char inbuf[IOBUFFER_SIZE];
int sockfd;
int len;
int nbytessent;
int nbytesrecvd;
int i;
/* Create a new TCP socket */
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
message("client socket failure %d\n", errno);
goto errout_with_outbufs;
}
/* Connect the socket to the server */
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(LISTENER_PORT);
myaddr.sin_addr.s_addr = htonl(inet_addr(TARGETIP));
message("client: Connecting to %s...\n", TARGETIP);
if (connect( sockfd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) < 0)
{
message("client: connect failure: %d\n", errno);
goto errout_with_socket;
}
message("client: Connected\n");
/* Then send and receive messages */
for (i = 0; ; i++);
{
sprintf(outbuf, "Remote message %d", i);
len = strlen(outbuf);
message("client: Sending '%s' (%d bytes)\n", outbuf, len);
nbytessent = send(sockfd, outbuf, len, 0);
message("client: Sent %d bytes\n", nbytessent);
if (nbytessent < 0)
{
message("client: send failed: %d\n", errno);
goto errout_with_socket;
}
else if (nbytessent != len)
{
message("client: Bad send length: %d Expected: %d\n", nbytessent, len);
goto errout_with_socket;
}
message("client: Receiving...\n");
nbytesrecvd = recv(sockfd, inbuf, IOBUFFER_SIZE, 0);
if (nbytesrecvd < 0)
{
message("client: recv failed: %d\n", errno);
goto errout_with_socket;
}
message("client: Received '%s' (%d bytes)\n", inbuf, nbytesrecvd);
if (nbytesrecvd != len)
{
message("client: Bad recv length: %d Expected: %d\n", nbytesrecvd, len);
goto errout_with_socket;
}
else if (memcmp(inbuf, outbuf, len) != 0)
{
message("client: Received outbuf does not match sent outbuf\n");
goto errout_with_socket;
}
message("client: Sleeping\n");
sleep(8);
}
close(sockfd);
return 0;
errout_with_socket:
close(sockfd);
errout_with_outbufs:
exit(1);
}