通过Winsock将字符串发送到HDFS

时间:2019-05-24 06:06:11

标签: c networking hdfs winsock winsock2

我当前正在实现一个C程序,该程序应使用Winsock2库将测试字符串发送到HDFS群集。 HDFS侦听端口9999,并且IP地址为10.32.0.91(我使用此IP地址通过Putty连接到HDFS Shell)。如果HDFS在端口9999上收到内容,它将自动将其写入测试文件。

例如,如果我将字符串“ hello”发送到端口9999,HDFS会将“ hello”写入测试文件。

但是似乎我的应用程序在发送此字符串时遇到了一些麻烦。在下面的代码中:

#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 个答案:

答案 0 :(得分:1)

您正在尝试将套接字本地绑定到不属于本地计算机的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;
}