• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Receive a datagram
3 
4   Copyright (c) 2011-2012, Intel Corporation
5   All rights reserved. This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include <errno.h>
16 #include <string.h>
17 #include <Uefi.h>
18 #include <unistd.h>
19 
20 #include <Library/DebugLib.h>
21 #include <Library/UefiLib.h>
22 
23 #include <netinet/in.h>
24 
25 #include <sys/socket.h>
26 #include <sys/time.h>
27 
28 UINT8 mBuffer[ 65536 ];
29 
30 /**
31   Receive a datagram
32 
33   @param [in] Argc  The number of arguments
34   @param [in] Argv  The argument value array
35 
36   @retval  0        The application exited normally.
37   @retval  Other    An error occurred.
38 **/
39 int
main(IN int Argc,IN char ** Argv)40 main (
41   IN int Argc,
42   IN char **Argv
43   )
44 {
45   struct sockaddr_in Address;
46   socklen_t AddressLength;
47   ssize_t LengthInBytes;
48   int s;
49   int Status;
50   struct timeval Timeout;
51 
52 
53   DEBUG (( DEBUG_INFO,
54             "%a starting\r\n",
55             Argv[0]));
56 
57   //
58   //  Get the socket
59   //
60   s = socket ( AF_INET, SOCK_DGRAM, 0 );
61   if ( -1 == s ) {
62     Print ( L"ERROR - Unable to open the socket, errno: %d\r\n", errno );
63   }
64   else {
65     Timeout.tv_sec = 5;
66     Timeout.tv_usec = 0;
67     Status = setsockopt ( s,
68                           SOL_SOCKET,
69                           SO_RCVTIMEO,
70                           &Timeout,
71                           sizeof ( Timeout ));
72     if ( -1 == Status ) {
73       Print ( L"ERROR - Unable to set the receive timeout, errno: %d\r\n", errno );
74     }
75     else {
76       AddressLength = sizeof ( Address );
77       LengthInBytes = recvfrom ( s,
78                                  &mBuffer[0],
79                                  sizeof ( mBuffer[0]),
80                                  0,
81                                  (struct sockaddr *)&Address,
82                                  &AddressLength );
83       if ( -1 == LengthInBytes ) {
84         if ( ETIMEDOUT == errno ) {
85           Print ( L"No datagram received\r\n" );
86         }
87         else {
88           Print ( L"ERROR - No datagram received, errno: %d\r\n", errno );
89         }
90       }
91       else {
92         Print ( L"Received %d bytes from %d.%d.%d.%d:%d\r\n",
93                 LengthInBytes,
94                 (UINT8)Address.sin_addr.s_addr,
95                 (UINT8)( Address.sin_addr.s_addr >> 8 ),
96                 (UINT8)( Address.sin_addr.s_addr >> 16 ),
97                 (UINT8)( Address.sin_addr.s_addr >> 24 ),
98                 htons ( Address.sin_port ));
99       }
100     }
101 
102     //
103     //  Done with the socket
104     //
105     close ( s );
106   }
107 
108   //
109   //  All done
110   //
111   DEBUG (( DEBUG_INFO,
112             "%a exiting, errno: %d\r\n",
113             Argv[0],
114             errno ));
115   return errno;
116 }
117