'Sending binary data between client and server

I am implementing a simple server-client inter-process communication by sending data in binary format from the client to the server. The program is simple: it sends an unsigned number from 1 to 5, once at a time, in binary format. The server reads in the these binary data and converts it back to an unsigned int. However, when I tried to read in on the server size, my binary data was changing. How can I make the reading protocol to read in the data in a format that I sent. I appreciate all helps that I can get! Thank you. Here is my implementation of the server:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <limits.h>
#include <netdb.h>

#define BUFFER_SIZE 10

int main(int argc, char *argv[])
{
    int serv_sock, ret, data_socket;
    socklen_t client_sock;
    struct sockaddr_in serv_addr;
    struct sockaddr_in client_addr;
    // char buffer[BUFFER_SIZE];
    uint32_t buffer = 0;
    FILE *fp;
    char hostname[HOST_NAME_MAX];
    char ipaddr[INET_ADDRSTRLEN];
    char port[6];

    serv_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1)
    {
        perror("socket");
        exit(1);
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(35000);
    ret = bind(serv_sock, (const struct sockaddr *)&serv_addr, sizeof(serv_addr)); // bind socket to server address
    if (ret == -1)
    {
        printf("bind error: %s\n", strerror(errno));
        exit(1);
    }
    listen(serv_sock, 20);
    // get hostname
    gethostname(hostname, HOST_NAME_MAX);
    // get ip address
    getnameinfo((struct sockaddr *)&serv_addr, sizeof(serv_addr), ipaddr, INET_ADDRSTRLEN, port, 6, NI_NUMERICHOST | NI_NUMERICSERV);
    // get port number
    printf("Server %s is running on %s : %s\n", hostname, ipaddr, port);
    while (1)
    {
        data_socket = accept(serv_sock, (struct sockaddr *)&client_addr, &client_sock);
        // print client host name and ip address
        getnameinfo((struct sockaddr *)&client_addr, sizeof(client_addr), hostname, HOST_NAME_MAX, port, 6, NI_NUMERICHOST | NI_NUMERICSERV);
        printf("Client %s is connected to %s : %s\n", hostname, ipaddr, port);
        if (data_socket == -1)
        {
            printf("accept error: %s\n", strerror(errno));
            exit(1);
        }
        while (1){
            int n = read(data_socket, &buffer, sizeof(uint32_t));
            if (n == -1)
            {
                printf("read error: %s\n", strerror(errno));
                exit(1);
            }
            if (n == 0)
            {
                break;
            }
            uint32_t temp = ntohl(buffer);
            printf("%d\n", temp);
        }
        close(data_socket);
        // if (!strncmp(buffer, "418", sizeof(buffer)))
        // {
        //     break;
        // }
    }
    close(serv_sock);
    return 0;
}

Client implimentation:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <inttypes.h>

int main(int argc, char *argv[])
{
    struct sockaddr_in addr;
    int ret, data_socket, i;
    unsigned int num_arr[5] = {1, 2, 3, 4, 5};
    char send_str[100];

    data_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (data_socket == -1)
    {
        perror("socket");
        exit(1);
    }
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(35000);
    ret = connect(data_socket, (const struct sockaddr *)&addr, sizeof(addr));
    if (ret == -1)
    {
        printf("connect error: %s\n", strerror(errno));
        exit(1);
    }

    for (i = 0; i < 5; i++)
    {
        // sprintf(send_str, "%d\n", num_arr[i]);
        // now send data as binary data
        uint32_t num = htonl(num_arr[i]);
        printf("%d\n", num);
        printf("%d\n", ntohl(num));
        write(data_socket, &num, sizeof(num));
        write(data_socket, "\n", 1);
    }
    uint32_t delimiter = htonl(-1);
    write(data_socket, &delimiter, sizeof(uint32_t));

    if (argc == 2)
    {
        if (strncmp(argv[1], "quit", 4) == 0)
        {
            printf("User quits\n");
            ret = write(data_socket, "418\n", 4);
        }
        else
        {
            printf("Wrong Argument\n");
        }
    }
    close(data_socket);
    return 0;
}
c


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source