#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> 
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>

#define BUFSIZE 1024
extern int errno;
void error(char *msg)
{
    perror(msg);
    exit(0);
}

void showdefaultvalues(int s)
{
  int optval, retval, optlen;
  
  optlen = sizeof(int);
  retval = getsockopt(s,IPPROTO_TCP,TCP_MAXSEG,&optval,&optlen);
  if (retval==0) printf("Max Segment Size is %d\n",optval);
  else perror("Error getting MSS");
  retval = getsockopt(s,IPPROTO_IP,IP_TTL,&optval,&optlen);
  if (retval==0) printf("TTL is %d\n",optval);
   else perror("Error getting TTL");
  retval = getsockopt(s,SOL_SOCKET,SO_RCVBUF,&optval,&optlen);
  if (retval==0) printf("Receiver Buffer is %d\n",optval);
   else perror("Error getting RCVBUF");
  retval = getsockopt(s,SOL_SOCKET,SO_SNDBUF,&optval,&optlen);
  if (retval==0) printf("Send Buffer is %d\n",optval);
   else perror("Error getting SNDBUF");
}

int main()
{
     int sock, newsock, len, fromlen, n;
     unsigned short port;
     struct sockaddr_in server, from;
     char buffer[1024];
     port = (unsigned short) 51717;
     sock=socket(AF_INET, SOCK_STREAM, 0);
     if (sock  < 0) error("Opening socket");
     server.sin_family=AF_INET;
     server.sin_addr.s_addr=INADDR_ANY;
     server.sin_port=htons(port);  
     len=sizeof(server);
     if (bind(sock, (struct sockaddr *)&server, len)  < 0) 
          error("binding socket");
     fromlen=sizeof(from);
     if (listen(sock,5)  < 0) 
          error("listening");
     showdefaultvalues(sock);
     while (1) {
         newsock=accept(sock, (struct sockaddr *)&from, &fromlen);
         if (newsock  < 0) error("Accepting");
         printf("A connection has been accepted from %s\n",
                 inet_ntoa((struct in_addr)from.sin_addr));
         showdefaultvalues(newsock);
         n = recv(newsock,buffer,BUFSIZE-1,0);
         if (n  < 1) {
	   error("Reading");
         }
         else {
           char *msg = "Hello from the server";
           buffer[n]='\0';
           printf("Message from client is: %s\n",buffer);
           len = strlen(msg);
           n = send(newsock,msg,len,0);
           if (n  < len) error("Error writing");
           if (close(newsock)  < 0) error("closing");           
	 }
     } 
     return 0; // we never get here 
}
