genericopenlibs/cstdlib/TSTLIB/TDGRAM.C
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/TSTLIB/TDGRAM.C	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,309 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Test of AF_LOCAL datagram sockets, based on Datagram example in GCC.HELP
+* 
+*
+*/
+
+
+
+#include <stddef.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __X86GCC__  
+#undef WIN32  // Seems to be included in the X86 baseport somewhere (we don't want winsock as this isn't an emulator build)
+#endif
+
+#ifdef WIN32
+	#include <winsock.h>
+#else
+	#include <unistd.h>
+	#include <sys/socket.h>
+	#include <sys/ioctl.h>
+	#include <libc/netinet/in.h>
+	#include <libc/arpa/inet.h>
+#endif
+int
+make_named_socket (int port)
+{
+//  struct sockaddr name;
+  struct sockaddr_in name;
+  int sock;
+  size_t size;
+
+  /* Create the socket. */
+
+  sock = socket (AF_INET, SOCK_DGRAM, 0);
+#ifdef WIN32
+	if ( INVALID_SOCKET == sock )
+	{
+		printf( "%s,%s,%d","CreateSocket", "socket", WSAGetLastError ( ) );
+		  exit (EXIT_FAILURE);
+	}
+#else
+	if (-1 == sock )
+	{
+      perror ("make_named_socket");
+		  exit (EXIT_FAILURE);
+	}
+#endif
+
+  /* Bind a name to the socket. */
+
+  name.sin_family = AF_INET;
+  name.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
+  name.sin_port = htons((unsigned short)port);
+
+  size = sizeof(struct sockaddr);
+
+  if (bind (sock, (struct sockaddr *) &name, size) < 0)
+    {
+      perror ("bind");
+      exit (EXIT_FAILURE);
+    }
+
+  return sock;
+}
+
+#define SERVER  99
+#define MAXMSG  512
+
+
+int server(void)
+	{
+	int server_sock;
+	char server_message[MAXMSG];
+	struct sockaddr name;
+	size_t size;
+	int nbytes = -1;
+
+	/* Make the socket, then loop endlessly. */
+
+	server_sock = make_named_socket (SERVER);
+	nbytes = sendto (server_sock, server_message, nbytes, 0, (struct sockaddr *) & name, size);
+	if (nbytes < 0)
+		{
+		perror ("sendto (server)");
+		exit (EXIT_FAILURE);
+		}
+	while (1)
+		{
+		/* Wait for a datagram. */
+		size = sizeof (name);
+		nbytes = recvfrom (server_sock, server_message, MAXMSG, 0, (struct sockaddr *) & name, &size);
+		if (nbytes < 0)
+			{
+			perror ("recfrom (server)");
+			break;
+			}
+
+		/* Give a diagnostic message. */
+		fprintf (stderr, "Server: got message: %s\n", server_message);
+
+		/* Bounce the message back to the sender. */
+		nbytes = sendto (server_sock, server_message, nbytes, 0, (struct sockaddr *) & name, size);
+		if (nbytes < 0)
+			{
+			perror ("sendto (server)");
+			break;
+			}
+		}/* end of - "while (1)" */
+	exit (EXIT_FAILURE);
+	return 0;
+	}
+
+#define CLIENT  125
+#define MESSAGE "Yow!!! Are we having fun yet?!? I'd like a 99 please..."
+
+int
+client (void)
+{
+  int sock;
+  char message[MAXMSG];
+  struct sockaddr_in name;
+  size_t size;
+  int nbytes;
+
+  /* Make the socket. */
+  sock = make_named_socket (CLIENT);
+
+  /* Initialize the server socket address. */
+  name.sin_family = AF_INET;
+  name.sin_port = htons((unsigned short)SERVER);
+  size = sizeof(name);
+
+  /* Send the datagram. */
+  nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
+                   (struct sockaddr *) & name, size);
+  if (nbytes < 0)
+    {
+      perror ("sendto (client)");
+      exit (EXIT_FAILURE);
+    }
+
+  /* Wait for a reply. */
+  nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
+  if (nbytes < 0)
+    {
+      perror ("recfrom (client)");
+      exit (EXIT_FAILURE);
+    }
+
+  /* Print a diagnostic message. */
+  fprintf (stderr, "Client: got message: %s\n", message);
+
+  /* Clean up. */
+#ifdef WIN32
+    closesocket (sock);
+#else
+	close(sock);
+#endif
+	return 0;
+}
+
+/**
+@SYMTestCaseID          SYSLIB-STDLIB-CT-1046
+@SYMTestCaseDesc	    Tests for AF_LOCAL datagram sockets
+@SYMTestPriority 	    High
+@SYMTestActions  	    Initialize the server socket address,send and receive messages on the socket.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/		
+int both_together(void)
+{
+  int server_sock;
+  char server_message[MAXMSG];
+  struct sockaddr_in name;
+  size_t size;
+  int nbytes;
+  int sock;
+  char message[MAXMSG];
+
+  /* Make the server socket */
+
+  server_sock = make_named_socket (SERVER);
+
+  sock = make_named_socket (CLIENT);
+
+  /* Initialize the server socket address. */
+  name.sin_family = AF_INET;
+  //name.sin_port = SERVER;
+  name.sin_port = htons((unsigned short)SERVER);
+	  name.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
+ size = sizeof(name);
+
+  /* Send the datagram. */
+  nbytes = sendto (server_sock, MESSAGE, strlen (MESSAGE) + 1, 0,
+                   (struct sockaddr *) & name, size);
+
+
+#ifdef WIN32
+  if (nbytes < 0)
+	{
+		printf( "%s,%s,%d","sendto", "socket", WSAGetLastError ( ) );
+		  exit (EXIT_FAILURE);
+	}
+#else
+  if (nbytes < 0)
+	{
+      perror ("sendto (server)");
+		  exit (EXIT_FAILURE);
+	}
+#endif
+  {
+  /* more server stuff */
+
+      size = sizeof (name);
+      nbytes = recvfrom (server_sock, server_message, MAXMSG, 0,
+                         (struct sockaddr *) & name, &size);
+#ifdef WIN32
+      if (nbytes < 0)
+	{
+		printf( "%s,%s,%d","recvfrom", "socket", WSAGetLastError ( ) );
+		  exit (EXIT_FAILURE);
+	}
+#else
+      if (nbytes < 0)
+	{
+      perror ("recvfrom (server)");
+		  exit (EXIT_FAILURE);
+	}
+#endif
+
+      /* Give a diagnostic message. */
+      fprintf (stderr, "Server: got message: %s\n", server_message);
+
+      /* Bounce the message back to the sender. */
+  name.sin_port = htons((unsigned short)CLIENT);
+      nbytes = sendto (sock, server_message, nbytes, 0,
+                       (struct sockaddr *) & name, size);
+#ifdef WIN32
+      if (nbytes < 0)
+        {
+		printf( "%s,%s,%d","sendto", "socket", WSAGetLastError ( ) );
+          exit (EXIT_FAILURE);
+        }
+#else
+      if (nbytes < 0)
+	{
+      perror ("sendto (client)");
+		  exit (EXIT_FAILURE);
+	}
+#endif
+  }
+
+  /* Wait for a reply. */
+  nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
+#ifdef WIN32
+      if (nbytes < 0)
+        {
+		printf( "%s,%s,%d","recvfrom", "socket", WSAGetLastError ( ) );
+          exit (EXIT_FAILURE);
+        }
+#else
+      if (nbytes < 0)
+	{
+      perror ("recvfrom (client)");
+		  exit (EXIT_FAILURE);
+	}
+#endif
+
+  /* Print a diagnostic message. */
+  fprintf (stderr, "Client: got message: %s\n", message);
+
+  /* Clean up. */
+#ifdef WIN32
+  closesocket (sock);
+  closesocket(server_sock);
+#else
+  close(sock);
+  close(server_sock);
+#endif
+
+  return 0;
+}
+
+int main(int argc, char*argv[])
+	{
+#ifdef WIN32
+	WORD wVersionRequested;WSADATA wsaData;int err; 
+	wVersionRequested = MAKEWORD( 1, 0 ); 
+	err = WSAStartup( wVersionRequested, &wsaData );
+#endif
+	return both_together();
+}