os/ossrv/genericopenlibs/cstdlib/TSTLIB/TDGRAM.C
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:
    15 * Test of AF_LOCAL datagram sockets, based on Datagram example in GCC.HELP
    16 * 
    17 *
    18 */
    19 
    20 
    21 
    22 #include <stddef.h>
    23 #include <stdio.h>
    24 #include <errno.h>
    25 #include <stdlib.h>
    26 #include <string.h>
    27 
    28 #ifdef __X86GCC__  
    29 #undef WIN32  // Seems to be included in the X86 baseport somewhere (we don't want winsock as this isn't an emulator build)
    30 #endif
    31 
    32 #ifdef WIN32
    33 	#include <winsock.h>
    34 #else
    35 	#include <unistd.h>
    36 	#include <sys/socket.h>
    37 	#include <sys/ioctl.h>
    38 	#include <libc/netinet/in.h>
    39 	#include <libc/arpa/inet.h>
    40 #endif
    41 int
    42 make_named_socket (int port)
    43 {
    44 //  struct sockaddr name;
    45   struct sockaddr_in name;
    46   int sock;
    47   size_t size;
    48 
    49   /* Create the socket. */
    50 
    51   sock = socket (AF_INET, SOCK_DGRAM, 0);
    52 #ifdef WIN32
    53 	if ( INVALID_SOCKET == sock )
    54 	{
    55 		printf( "%s,%s,%d","CreateSocket", "socket", WSAGetLastError ( ) );
    56 		  exit (EXIT_FAILURE);
    57 	}
    58 #else
    59 	if (-1 == sock )
    60 	{
    61       perror ("make_named_socket");
    62 		  exit (EXIT_FAILURE);
    63 	}
    64 #endif
    65 
    66   /* Bind a name to the socket. */
    67 
    68   name.sin_family = AF_INET;
    69   name.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    70   name.sin_port = htons((unsigned short)port);
    71 
    72   size = sizeof(struct sockaddr);
    73 
    74   if (bind (sock, (struct sockaddr *) &name, size) < 0)
    75     {
    76       perror ("bind");
    77       exit (EXIT_FAILURE);
    78     }
    79 
    80   return sock;
    81 }
    82 
    83 #define SERVER  99
    84 #define MAXMSG  512
    85 
    86 
    87 int server(void)
    88 	{
    89 	int server_sock;
    90 	char server_message[MAXMSG];
    91 	struct sockaddr name;
    92 	size_t size;
    93 	int nbytes = -1;
    94 
    95 	/* Make the socket, then loop endlessly. */
    96 
    97 	server_sock = make_named_socket (SERVER);
    98 	nbytes = sendto (server_sock, server_message, nbytes, 0, (struct sockaddr *) & name, size);
    99 	if (nbytes < 0)
   100 		{
   101 		perror ("sendto (server)");
   102 		exit (EXIT_FAILURE);
   103 		}
   104 	while (1)
   105 		{
   106 		/* Wait for a datagram. */
   107 		size = sizeof (name);
   108 		nbytes = recvfrom (server_sock, server_message, MAXMSG, 0, (struct sockaddr *) & name, &size);
   109 		if (nbytes < 0)
   110 			{
   111 			perror ("recfrom (server)");
   112 			break;
   113 			}
   114 
   115 		/* Give a diagnostic message. */
   116 		fprintf (stderr, "Server: got message: %s\n", server_message);
   117 
   118 		/* Bounce the message back to the sender. */
   119 		nbytes = sendto (server_sock, server_message, nbytes, 0, (struct sockaddr *) & name, size);
   120 		if (nbytes < 0)
   121 			{
   122 			perror ("sendto (server)");
   123 			break;
   124 			}
   125 		}/* end of - "while (1)" */
   126 	exit (EXIT_FAILURE);
   127 	return 0;
   128 	}
   129 
   130 #define CLIENT  125
   131 #define MESSAGE "Yow!!! Are we having fun yet?!? I'd like a 99 please..."
   132 
   133 int
   134 client (void)
   135 {
   136   int sock;
   137   char message[MAXMSG];
   138   struct sockaddr_in name;
   139   size_t size;
   140   int nbytes;
   141 
   142   /* Make the socket. */
   143   sock = make_named_socket (CLIENT);
   144 
   145   /* Initialize the server socket address. */
   146   name.sin_family = AF_INET;
   147   name.sin_port = htons((unsigned short)SERVER);
   148   size = sizeof(name);
   149 
   150   /* Send the datagram. */
   151   nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
   152                    (struct sockaddr *) & name, size);
   153   if (nbytes < 0)
   154     {
   155       perror ("sendto (client)");
   156       exit (EXIT_FAILURE);
   157     }
   158 
   159   /* Wait for a reply. */
   160   nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
   161   if (nbytes < 0)
   162     {
   163       perror ("recfrom (client)");
   164       exit (EXIT_FAILURE);
   165     }
   166 
   167   /* Print a diagnostic message. */
   168   fprintf (stderr, "Client: got message: %s\n", message);
   169 
   170   /* Clean up. */
   171 #ifdef WIN32
   172     closesocket (sock);
   173 #else
   174 	close(sock);
   175 #endif
   176 	return 0;
   177 }
   178 
   179 /**
   180 @SYMTestCaseID          SYSLIB-STDLIB-CT-1046
   181 @SYMTestCaseDesc	    Tests for AF_LOCAL datagram sockets
   182 @SYMTestPriority 	    High
   183 @SYMTestActions  	    Initialize the server socket address,send and receive messages on the socket.
   184 @SYMTestExpectedResults Test must not fail
   185 @SYMREQ                 REQ0000
   186 */		
   187 int both_together(void)
   188 {
   189   int server_sock;
   190   char server_message[MAXMSG];
   191   struct sockaddr_in name;
   192   size_t size;
   193   int nbytes;
   194   int sock;
   195   char message[MAXMSG];
   196 
   197   /* Make the server socket */
   198 
   199   server_sock = make_named_socket (SERVER);
   200 
   201   sock = make_named_socket (CLIENT);
   202 
   203   /* Initialize the server socket address. */
   204   name.sin_family = AF_INET;
   205   //name.sin_port = SERVER;
   206   name.sin_port = htons((unsigned short)SERVER);
   207 	  name.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
   208  size = sizeof(name);
   209 
   210   /* Send the datagram. */
   211   nbytes = sendto (server_sock, MESSAGE, strlen (MESSAGE) + 1, 0,
   212                    (struct sockaddr *) & name, size);
   213 
   214 
   215 #ifdef WIN32
   216   if (nbytes < 0)
   217 	{
   218 		printf( "%s,%s,%d","sendto", "socket", WSAGetLastError ( ) );
   219 		  exit (EXIT_FAILURE);
   220 	}
   221 #else
   222   if (nbytes < 0)
   223 	{
   224       perror ("sendto (server)");
   225 		  exit (EXIT_FAILURE);
   226 	}
   227 #endif
   228   {
   229   /* more server stuff */
   230 
   231       size = sizeof (name);
   232       nbytes = recvfrom (server_sock, server_message, MAXMSG, 0,
   233                          (struct sockaddr *) & name, &size);
   234 #ifdef WIN32
   235       if (nbytes < 0)
   236 	{
   237 		printf( "%s,%s,%d","recvfrom", "socket", WSAGetLastError ( ) );
   238 		  exit (EXIT_FAILURE);
   239 	}
   240 #else
   241       if (nbytes < 0)
   242 	{
   243       perror ("recvfrom (server)");
   244 		  exit (EXIT_FAILURE);
   245 	}
   246 #endif
   247 
   248       /* Give a diagnostic message. */
   249       fprintf (stderr, "Server: got message: %s\n", server_message);
   250 
   251       /* Bounce the message back to the sender. */
   252   name.sin_port = htons((unsigned short)CLIENT);
   253       nbytes = sendto (sock, server_message, nbytes, 0,
   254                        (struct sockaddr *) & name, size);
   255 #ifdef WIN32
   256       if (nbytes < 0)
   257         {
   258 		printf( "%s,%s,%d","sendto", "socket", WSAGetLastError ( ) );
   259           exit (EXIT_FAILURE);
   260         }
   261 #else
   262       if (nbytes < 0)
   263 	{
   264       perror ("sendto (client)");
   265 		  exit (EXIT_FAILURE);
   266 	}
   267 #endif
   268   }
   269 
   270   /* Wait for a reply. */
   271   nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
   272 #ifdef WIN32
   273       if (nbytes < 0)
   274         {
   275 		printf( "%s,%s,%d","recvfrom", "socket", WSAGetLastError ( ) );
   276           exit (EXIT_FAILURE);
   277         }
   278 #else
   279       if (nbytes < 0)
   280 	{
   281       perror ("recvfrom (client)");
   282 		  exit (EXIT_FAILURE);
   283 	}
   284 #endif
   285 
   286   /* Print a diagnostic message. */
   287   fprintf (stderr, "Client: got message: %s\n", message);
   288 
   289   /* Clean up. */
   290 #ifdef WIN32
   291   closesocket (sock);
   292   closesocket(server_sock);
   293 #else
   294   close(sock);
   295   close(server_sock);
   296 #endif
   297 
   298   return 0;
   299 }
   300 
   301 int main(int argc, char*argv[])
   302 	{
   303 #ifdef WIN32
   304 	WORD wVersionRequested;WSADATA wsaData;int err; 
   305 	wVersionRequested = MAKEWORD( 1, 0 ); 
   306 	err = WSAStartup( wVersionRequested, &wsaData );
   307 #endif
   308 	return both_together();
   309 }