Search code examples
cnetwork-programmingnetstat

Modify the server so that it will only listen on loopback interface


I'm trying to run client server connection. Here's my code:

server.c

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

#define MAX_BUFFER 128
#define DAYTIME_SERVER_PORT 13

/.../ int main(void) { int serverFd, connectionFd; struct sockaddr_in servaddr; char timebuffer[MAX_BUFFER+1]; time_t currenTime;

    serverFd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0 , sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(DAYTIME_SERVER_PORT);

    bind(serverFd, (struct sockaddr *) &servaddr, sizeof(servaddr));
    listen(serverFd, 5);

    while(1)
    {
        connectionFd = accept(serverFd, (struct sockaddr *) NULL, NULL);

        if(connectionFd >= 0)
        {
            currenTime = time(NULL);
            snprintf(timebuffer, MAX_BUFFER, "%s\n", ctime(&currenTime));
            write(connectionFd, timebuffer, strlen(timebuffer));
            close(connectionFd);
        }
    }
}

client.c

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

#define MAX_BUFFER 128
#define DAYTIME_SERVER_PORT 13


int main()
{
    int connectionFd, in;
    struct sockaddr_in servaddr;
    char timebuffer[MAX_BUFFER+1];

    connectionFd = socket(AF_INET,SOCK_STREAM,0);

    memset(&servaddr,0 ,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(connectionFd,(struct sockaddr_in *) &servaddr , sizeof(servaddr));

    while((in = read(connectionFd, timebuffer, MAX_BUFFER)) >0)
    {
        timebuffer[in] = 0;
        printf("\n%s" , timebuffer);
    }
    /*...*/
    close(connectionFd);

}

How to modify server to listen on loopback interface (not other interface)?


Solution

  • Change

    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    

    to just use the loop back address. i.e.

    servaddr.sin_addr.s_addr = htonl(2130706433L)
    

    (used http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx to do the maths)