通过Winsock将字符串发送到HDFS

通过Winsock将字符串发送到HDFS,c,networking,hdfs,winsock,winsock2,C,Networking,Hdfs,Winsock,Winsock2,我目前正在实现一个C程序,它可以使用Winsock2库向HDFS集群发送一个测试字符串。 HDFS侦听端口9999,IP地址为10.32.0.91(我使用此IP地址通过Putty连接到HDFS外壳)。如果HDFS在端口9999上接收到某些内容,它会自动将其写入测试文件 例如:如果我将字符串“hello”发送到端口9999,HDFS会将“hello”写入测试文件 但我的应用程序似乎在发送此字符串时遇到了一些问题。在以下内容中,您可以看到代码: #include <stdio.h> #i

我目前正在实现一个C程序,它可以使用Winsock2库向HDFS集群发送一个测试字符串。 HDFS侦听端口9999,IP地址为10.32.0.91(我使用此IP地址通过Putty连接到HDFS外壳)。如果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;
}
#包括
#包括
//用于联网
#包括
#包括
int startWinsock(){
WSADATA wsa;
返回WSAStartup(MAKEWORD(2,0),&wsa);
}
int main(int argc,字符**argv){
//初始化Winsock
长钢筋混凝土;
rc=startWinsock();
如果(rc!=0){
printf(“错误:startWinsock,错误代码:%d\n”,rc);
返回退出失败;
}否则{
printf(“Winsock已启动!\n”);
}
printf(“已初始化。\n”);
//创建套接字
插座;
if((s=套接字(AF\u INET,SOCK\u STREAM,0))==无效的套接字){
printf(“无法创建套接字:%d”,WSAGetLastError());
}
printf(“已创建套接字。\n”);
//连接到远程服务器
hdfs_服务器中的结构sockaddr_;
memset(&hdfs_服务器,0,sizeof(hdfs_服务器));
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((绑定(s,(struct sockaddr*)&hdfs_服务器,sizeof(hdfs_服务器))<0)){
perror(“错误:绑定失败!”);
返回退出失败;
}
//发送字符串
char*sendbuf=“你好”;
发送(s,sendbuf,(int)strlen(sendbuf),0);
返回0;
}
执行此代码时,我在命令提示符中得到以下输出:


我做错了什么?IP地址必须正确,因为我可以通过输入此IP地址通过putty连接。有什么建议吗?非常感谢您的帮助

您试图将套接字本地绑定到不属于本地计算机的IP地址,这就是为什么您从
bind()
中得到“invalid argument”错误的原因

由于您编写的是客户机而不是服务器,因此需要使用
connect()
而不是
bind()

//连接到远程服务器
hdfs_服务器中的结构sockaddr_;
memset(&hdfs_服务器,0,sizeof(hdfs_服务器));
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(连接(s,(struct sockaddr*)&hdfs_服务器,sizeof(hdfs_服务器))<0){
perror(“错误:连接失败!”);
返回退出失败;
}
// 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;
}