Отправить строку в HDFS через Winsock - PullRequest
0 голосов
/ 24 мая 2019

В настоящее время я реализую программу на C, которая должна отправлять тестовую строку в кластер HDFS с помощью библиотеки Winsock2.HDFS прослушивает порт 9999, а IP-адрес - 10.32.0.91 (я использую этот IP-адрес для подключения к оболочке HDFS через Putty).Если HDFS получает что-то через порт 9999, он автоматически записывает это в тестовый файл.

Так, например: если я отправлю строку «привет» на порт 9999, HDFS запишет «привет» в тестовый файл.

Но, похоже, у моего приложения возникли проблемы при отправке этой строки.Ниже вы можете увидеть код:

#include <stdio.h>
#include <stdlib.h>

// for networking
#include <Windows.h>
#include <winsock2.h>

int startWinsock() {
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2, 0), &wsa);
}

int main(int argc, char **argv){

    // Initialising Winsock
    long rc;
    rc = startWinsock();
    if(rc != 0) {
        printf("Error: startWinsock, error code: %d\n", rc);
        return EXIT_FAILURE;
    } else {
       printf("Winsock has started!\n");
    }

    printf("Initialised.\n");

    // Create socket
    SOCKET s;
    if((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    printf("Socket created.\n");

    // Connect to remote server
    struct sockaddr_in hdfs_server;
    memset(&hdfs_server, 0, sizeof(hdfs_server));
    hdfs_server.sin_addr.s_addr = inet_addr("10.32.0.91");
    hdfs_server.sin_family = AF_INET;
    hdfs_server.sin_port = htons(9999);

    // bind socket to local address and port
    if((bind(s, (struct sockaddr *)&hdfs_server, sizeof(hdfs_server)) < 0)){
        perror("Error:bind failed!");
        return EXIT_FAILURE;
    }

    // send string
    char *sendbuf = "Hello";
    send(s, sendbuf, (int)strlen(sendbuf), 0);

    return 0;
}

При выполнении этого кода я получаю следующий вывод в командной строке:

enter image description here

Что я здесь не так делаю?IP-адрес должен быть правильным, потому что я могу подключиться через замазку, введя этот IP-адрес.Какие-либо предложения?Любая помощь высоко ценится!

1 Ответ

1 голос
/ 24 мая 2019

Вы пытаетесь привязать свой сокет локально к IP-адресу, который не принадлежит локальному компьютеру, поэтому вы получаете сообщение об ошибке «Недопустимый аргумент» от bind().

Поскольку вы пишете клиент, а не сервер, вам нужно использовать connect() вместо bind():

// Connect to remote server
struct sockaddr_in hdfs_server;
memset(&hdfs_server, 0, sizeof(hdfs_server));
hdfs_server.sin_addr.s_addr = inet_addr("10.32.0.91");
hdfs_server.sin_family = AF_INET;
hdfs_server.sin_port = htons(9999);

if(connect(s, (struct sockaddr *)&hdfs_server, sizeof(hdfs_server)) < 0){
    perror("Error:connect failed!");
    return EXIT_FAILURE;
}
...