A Minimal Client-Server in C

Wrote a basic server and client in C. Server listens, client says hi, server replies.

server.c

int main(int argc, char *argv[]) {
    int sockfd, newsockfd;
    struct sockaddr_in serv_addr, cli_addr;
    socklen_t clilen;
    char buffer[1024];

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(atoi(argv[1]));

    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);

    while (1) {
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        memset(buffer, 0, 1024);
        read(newsockfd, buffer, 1023);
        printf("Client: %s\n", buffer);
        write(newsockfd, "Hello from server\n", 18);
        close(newsockfd);
    }
}

client.c

int main(int argc, char *argv[]) {
    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[1024];

    server = gethostbyname(argv[1]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&serv_addr, 0, sizeof(serv_addr));
    memcpy(&serv_addr.sin_addr, server->h_addr, server->h_length);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));

    connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    strcpy(buffer, argv[3]);
    write(sockfd, buffer, strlen(buffer));
    close(sockfd);
}

Compile

gcc server.c -o server
gcc client.c -o client

Run

# Terminal 1 – Start the server:
./server 3500
# Terminal 2 – Run the client:
./client 127.0.0.1 3500 "hello server"