通过 Winsock 将字符串发送到 HDFS
Send string to HDFS via Winsock
我目前正在实现一个 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;
}
执行此代码时,我在命令提示符中得到以下输出:
我在这里做错了什么? IP 地址必须正确,因为我可以通过输入此 IP 地址通过 Putty 进行连接。有什么建议么?非常感谢任何帮助!
您正在尝试将您的套接字本地绑定到不属于本地计算机的 IP 地址,这就是您从 bind()
.[=14= 收到 "invalid argument" 错误的原因]
由于您编写的是客户端而不是服务器,因此需要使用 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 程序,它应该使用 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;
}
执行此代码时,我在命令提示符中得到以下输出:
我在这里做错了什么? IP 地址必须正确,因为我可以通过输入此 IP 地址通过 Putty 进行连接。有什么建议么?非常感谢任何帮助!
您正在尝试将您的套接字本地绑定到不属于本地计算机的 IP 地址,这就是您从 bind()
.[=14= 收到 "invalid argument" 错误的原因]
由于您编写的是客户端而不是服务器,因此需要使用 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;
}