c - 通过Winsock发送字符串到HDFS

标签 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 地址通过 putty 进行连接。有什么建议么?非常感谢任何帮助!

最佳答案

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

关于c - 通过Winsock发送字符串到HDFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56286716/

相关文章:

c - 段错误: 11 when trying to print linked list

c - Termcap tgetstr 获取方向键

c - 556以下的C程序输出如何?请解释一下 char *b=(char *)&a;

hadoop - NameNode 不以 start-all.sh 开头

hadoop - 查找 HDFS 监听的端口号

c - 如何不阻止设备被弹出/安全移除?

javascript - Webrtc 与 Goinstant 无法跨不同网络工作

iPhone 3G/WiFi 连接

ios - Alamofire 网络 REST 调用抛出 SSL 错误(突然)

hadoop - HMaster 启动后很快停止