/* server.c */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
        printf("Server program started.\n");

        /* socket */
        int mySocket = socket(AF_INET, SOCK_STREAM, 0);
        if( mySocket == -1 ) {
                printf("Bad socket.\n");
                exit(1);
        }

        /* bind */
        struct sockaddr_in serverAddress;
        serverAddress.sin_family = AF_INET;
        serverAddress.sin_addr.s_addr = INADDR_ANY;
        serverAddress.sin_port = 10005;
        if( bind(mySocket,(struct sockaddr *) &serverAddress, sizeof(serverAddress)) == -1 ) {
                printf("Bad bind.\n");
                exit(1);
        }

        /* listen */
        int listenValue = listen(mySocket, 5);
        if( listenValue == -1 ) {
                printf("Bad return from listen().\n");
                exit(1);
        } else {
                printf("Server is listening...\n");
        }

        /* accept */
        struct sockaddr_in clientAddress;
        socklen_t clientLength = sizeof(clientAddress);
        int newSocket = accept(mySocket, (struct sockaddr *) &clientAddress, &clientLength);
        printf("Value of mySocket is: %i\n", mySocket);
        printf("Value of newSocket is: %i\n", newSocket);

        /* recv */
        char recvBuffer[1024];
        bzero(recvBuffer, 1024);
        int recvFlags;
        printf("DEBUG: before recv()\n");
/*      int messageLength = recv(newSocket, recvBuffer, 1024, recvFlags); */
        int messageLength = read(newSocket, recvBuffer, 1024);
        printf("DEBUG: after recv()\n");
        printf("Message: %s\n", recvBuffer);

        /* send */
        char sendBuffer[1024];
        sprintf(sendBuffer, "The server has received the message.");
        int sendFlags;
/*      send(newSocket, sendBuffer, strlen(sendBuffer), sendFlags); */
        messageLength = write(newSocket, sendBuffer, strlen(sendBuffer));

        /* close */
        close(newSocket);
        close(mySocket);

        return 0;
}
