⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echoclient.c

📁 vxworks demo 有问题写信给我
💻 C
字号:
/* echoClient.c - TCP echo client program *//* Copyright 1984-1997 Wind River Systems, Inc. */ /*modification history--------------------01f,06nov97,mm   added copyright.01e,29Sep97,mm   cast arg 1 of `bzero' , cast arg 2 of `connect', cast arg 4 of `setsockopt'01d,17Sep97,mm   deleted line IMPORT int tcp_keepidle = 101c,17Sep97,mm   changed int optionVal to char optionVal 01b,16Sep97,mm   included <stdio.h> <string.h> <arpa/inet.h>01a,07Feb94,ms   cleaned up for VxDemo.*/#include <stdio.h>#include <string.h>#include <stddef.h>#include <arpa/inet.h>#include <vxWorks.h>#include "socket.h"#include "in.h"#include "ioLib.h"#include "errno.h"#include "netinet/tcp.h"#include <sockLib.h>LOCAL int  defaultTimes	= 50;   /* default number of times for echo service */LOCAL int  defaultPort	= 7001; /* default port number used by echoTcpServer */LOCAL char  defaultServer[16] = "147.11.184.2";  /* default echo server's inet 					      * address */LOCAL char defaultMessage[80] = "Hello World!!!\n"; /* Buffer for the default 						 * message *//* Change the default keepidle time (timeout for probing the idle* connection) from several hours to few minutes.*//*IMPORT int tcp_keepidle = 1;*/LOCAL int echoTcpClientSock (char *, int); /* set up TCP socket */LOCAL void  echoTcpClient (int, int, char*); /*UDP echo client*//***************************************************************************** * echoTcpClientRun - Runs the TCP client task for echo service * * DESCRIPTION * *     The TCP echo client repeatedly sends the input and then reads it back  *     using TCP socket communication. * *     ECHO services are important tools that network managers use to test *     reachability (to make sure the connection works), debug protocol  *     software, and identify routing problems. * *     This also demonstrates the usage of SO_REUSEADDR, SO_KEEPALIVE and *     TCP_NODELAY set socket options. *  * CONFIGURATION:  * * You need to set/change the value of the defaultPort (should be greater than * 5000 - unreserved port) and the defaultServer (internet address of the * echo server) variables. * * EXAMPLE: * *     Run this echoTcpClientRun task on one VxWorks system as follows *     after starting the echoTcpServerRun task from another VxWorks system. *     The other half of the demonstration is in echoServer.c. * *     sp (echoTcpClientRun, inetAddrOfServer, port, numTimes, msg) * *     where inetAddrOfServer is the internet address of the network *     interface of the VxWorks system running echoTcpServerRun task, *     port is the port number used by the echoTcpServer (should be *     greater than 5000), numTimes is the number of times echo service is *     requested, and msg is the message to echo. *      *     example: *     -> sp (echoTcpClientRun, "147.11.184.2", 7001, 5, "Hello World!!!") * */void echoTcpClientRun    (    char *server,                /* internet address of the echo server;                                   * 0 to use default */     int  port,                   /* port number; 0 to use the last used one*/    int  numTimes,               /* number of times for echo service */    char *msg                    /* Message to echo; 0 to use default or last                                    used message */     )    {        int clientSock;          /* socket fd opened to the server */	clientSock = echoTcpClientSock (server, port);        if (clientSock == ERROR)            printf ("Error creating client socket\n");        else 	    echoTcpClient (clientSock, numTimes, msg);        close (clientSock);    }/***************************************************************************** * echoTcpClientSock - Sets up a TCP socket connection with echo client  * * DESCRIPTION * *     Sets up a TCP socket connection with echo server with various socket *     options. * * RETURNS: OK or ERROR */int echoTcpClientSock     (    char 	*server,   /* inet number of echo server */    int 	port       /* port number */    )    {    int			echoClientSock; /* socket opened to echo server */    int			optionVal;      /* value of setsocket option */    struct sockaddr_in	serverAddr;    /* server's address */    if (server == NULL)	server = defaultServer;    if (port == 0)	port = defaultPort;    else	defaultPort = port;    if (port < 5000)        {        printf ("echoTcpClientSock: invalid port number\n");        return (ERROR);        }    /* open the socket */    echoClientSock = socket (AF_INET, SOCK_STREAM, 0);    if (echoClientSock == ERROR)	{	perror ("echoTcpClientSock: socket open failed");	return (ERROR);	}    optionVal = 1; /* Turn ON the different setsockopt options */    /* Specify the SO_REUSEADDR option  to bind a stream socket to a local       * port  that may be still bound to another stream socket that may be      * hanging around with a "zombie" protocol control block whose context     * is  not yet freed from previous sessions.     */    if (setsockopt (echoClientSock, SOL_SOCKET, SO_REUSEADDR, (char *)&optionVal,		    sizeof(optionVal)) == ERROR)	{	perror ("echoTcpClientSock: setsockopt SO_REUSEADDR failed");	close (echoClientSock);	return (ERROR);	}    /* Specify the TCP_NODELAY option for protocols such as X Window System      * Protocol that require immediate delivery of many small messages.      *     * By default VxWorks uses congestion avoidance algorithm      * for virtual  terminal  protocols and  bulk  data  transfer       * protocols. When the TCP_NODELAY option is turned on and there are      * segments to be sent out, TCP  bypasses  the  congestion     * avoidance algorithm  and sends the segments out when there      * is enough space in the send window.     */    if (setsockopt (echoClientSock, IPPROTO_TCP, TCP_NODELAY, (char *)&optionVal,		    sizeof(optionVal)) == ERROR)	{	perror ("echoTcpClientSock: setsockopt TCP_NODELAY failed");	close (echoClientSock);	return (ERROR);	}    /* Specify the SO_KEEPALIVE option, and the transport protocol (TCP)       * initiates  a timer to detect a dead connection which prevents an     * an application from  hanging on an invalid connection.     */    if (setsockopt (echoClientSock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optionVal,		    sizeof(optionVal)) == ERROR)       {       perror ("echoTcpClientSock: setsockopt SO_KEEPALIVE failed");       close (echoClientSock);       return (ERROR);       }       /* Set up server's internet address and connect to the server */    /* Zero out the sock_addr structures.     * This MUST be done before the socket calls.     */    bzero ((char  *) &serverAddr, sizeof (serverAddr));    serverAddr.sin_family	= AF_INET;    serverAddr.sin_port	= htons (port);    serverAddr.sin_addr.s_addr	= inet_addr (server);    printf ("Server's address is %x:\n", ntohl (serverAddr.sin_addr.s_addr));    if (connect (echoClientSock, (struct sockaddr  *) &serverAddr, sizeof (serverAddr)) < 0)	{	perror ("echoTcpClientSock: connect failed");	close (echoClientSock);	return (ERROR);	}    printf ("Connected...\n");     return (echoClientSock);    }/***************************************************************************** * echoTcpClient - the TCP client for echo service * * DESCRIPTION * *     echoTcpClient enters a loop that repeatedly sends message across the *     TCP connection to the echo server, reads it back and prints it. *     After all input messages have been sent to the server, received back, *     and printed successfully, the client exits.   * */void echoTcpClient     (    int echoClientSock,           /* client socket fd */    int   times,                  /* number of times for echo service */    char *message                 /* message buffer for echo service */    )    {    int		ix;               /* loop counter */    int		msgLen;           /* length of the message */    char 	buffer [80];      /* echoed message buffer */    int 	numToRead;        /* number of bytes to read */     int 	numRead;          /* number of bytes read */    if (times == 0)	times = defaultTimes;    else	defaultTimes = times;    if (message == NULL)	message = defaultMessage;        msgLen = strlen (message);    printf ("The length of the message is - %d bytes\n", msgLen);     printf ("Message: %s\n\n", message);    for (ix = 0; ix < times; ++ix)	{	if (send (echoClientSock, message, msgLen, 0) < 0)            {            perror ("echoTcpClient: echo CLIENT write error");            return;            }        /* number of bytes to be read is assumed to be less than 80         * bytes and the message is NULL terminated for this demonstration.         */	for (numToRead = msgLen; numToRead > 0; numToRead -= numRead)	    {	    buffer[0] = '\0';	    numRead = recv (echoClientSock, buffer, numToRead, 0);	    printf ("echoTcpClient received echo message: %s\n", buffer);	    if (numRead == ERROR)		{                perror ("echoTcpClient: echo CLIENT recv error");                break;		}	    }	}    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -