gtpc1m72 | Transmission Control Protocol/Internet Protocol |
/**********************************************************/
/* This is a datagram socket server sample program. */
/* When a message from the client program is received, */
/* it echoes back the message to the client program. */
/**********************************************************/
/**********************************************************/
/* TPF Standard Header Files */
/**********************************************************/
#include <tpfeq.h>
#include <tpfio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <types.h>
#include <socket.h> /* Socket API Header File */
#define return_error -1
qxyb()
{
const message_size = 32 * 1024;
struct sockaddr_in client_sockaddr_in;
struct sockaddr_in server_sockaddr_in;
char *recv_client_message;
char *send_client_message;
int echo_len;
int optlen;
int optval;
int rc;
int server_sock;
int sockaddr_in_length;
send_client_message = malloc(message_size);
recv_client_message = malloc(message_size);
sockaddr_in_length = sizeof(struct sockaddr_in);
/****************************/
/* Create a datagram socket.*/
/****************************/
server_sock = socket(AF_INET,SOCK_DGRAM,0);
if (server_sock == return_error)
{
printf("Error in opening a datagram socket\n");
exit(0);
}
printf("Host sock = %d\n",server_sock);
/***********************************/
/* Bind a local name to the socket.*/
/***********************************/
server_sockaddr_in.sin_family = AF_INET;
server_sockaddr_in.sin_port = 5001;
server_sockaddr_in.sin_addr.s_addr = INADDR_ANY;
rc = bind(server_sock,(struct sockaddr *)&server_sockaddr_in,
sockaddr_in_length);
if (rc == return_error)
{
printf("Error in binding - %d\n",sock_errno());
(void)close(server_sock);
exit(0);
}
/******************************************************/
/* Get the server information, and print its data out.*/
/******************************************************/
rc = getsockname(server_sock,(struct sockaddr *)&server_sockaddr_in,
&sockaddr_in_length);
if (rc != return_error)
{
printf("Server Information\n");
printf("--------------------------------\n");
printf("Server sock - %d\n",server_sock);
printf("Server IP address - %x\n",
server_sockaddr_in.sin_addr.s_addr);
printf("Server port # - %d\n\n",
server_sockaddr_in.sin_port);
}
optval = message_size;
optlen = sizeof(optval);
rc = setsockopt(server_sock,SOL_SOCKET,SO_SNDBUF,(char *)&optval,
optlen);
if (rc == return_error)
{
printf("Error in setsockopt - %d\n",sock_errno());
(void)close(server_sock);
exit(0);
}
printf(".... Ready for clients ....\n");
/****************/
/* Loop forever */
/****************/
for (;;)
{
/*******************************/
/* Monitor incoming buffers. */
/*******************************/
rc = recvfrom(server_sock,recv_client_message,message_size,0,
(struct sockaddr *)&client_sockaddr_in,
&sockaddr_in_length);
if (rc == return_error)
{
printf("Error in receiving message - %d\n",sock_errno());
break;
}
else
{
/******************************************************/
/* Print out the client information and message length*/
/* and then echo the same message back to that client.*/
/******************************************************/
echo_len = rc;
(void)memcpy(send_client_message,recv_client_message,echo_len);
rc = sendto(server_sock,send_client_message,echo_len,0,
(struct sockaddr *)&client_sockaddr_in,
sockaddr_in_length);
if (rc == return_error)
printf("Error in sending message to a client - %d\n",
sock_errno());
}
} /* end of for(;;) */
/************************************************************/
/* Return the socket back to the system and exit normally. */
/************************************************************/
rc = close(server_sock);
if (rc == return_error)
{
printf("Error in closing the socket - %d\n",sock_errno());
printf("DATAGRAM NOAOR server terminated\n");
exit(0);
}
printf("Datagram server terminated\n");
exit(0);
}