-5

可能重复:
通过 tcp 从 linux 连接到 windows

我在 windows/c# 上有一个 TCP 客户端,在 linux/c++ 上有另一个客户端。我在两者上都有一个 TCP 服务器。

我在 windows/c# 上的 TCP 客户端工作正常,问题是 linux/c++ 上的 TCP 客户端

当我连接到 linux/c++ 上的 TCP 服务器时,它运行良好,但是当我尝试连接到 windows/c# 上的 TCP 服务器时,它没有连接,但 ping 正常。

这是失败的代码部分:

int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;  
struct in_addr addr={0};
char buffer[256];
if (argc < 3) {
   fprintf(stderr,"usage %s hostname port\n", argv[0]);
   exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
    error("ERROR opening socket");
addr.s_addr=inet_addr(argv[1]);
server = gethostbyaddr((char *) &addr, 6, AF_INET);
if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);

问题在于:

server = gethostbyaddr((char *) &addr, 6, AF_INET);

它返回 null,所以它打印“错误,没有这样的主机”

我尝试了每一种组合:

-TCP客户端(linux)到TCP服务器(linux)

-TCP客户端(linux)到TCP服务器(windows)

-TCP客户端(windows)到TCP服务器(linux)

-TCP客户端(windows)到TCP服务器(windows)

一切正常,除了:TCP客户端(linux)到TCP服务器(windows)

我还尝试了 TCP 客户端 netcat(包含在 linux 上)到 TCP 服务器(windows),它可以工作。

我已经从 windows 到 linux 以及从 linux 到 windows 都调用了 ping,它收到 100%

我不知道为什么我的 TCP 客户端(linux)没有连接到 TCP 服务器(linux)

4

1 回答 1

0

您必须拥有某种名称服务,例如 DNS,才能让 gethostbyaddr() 确定给定地址的主机名。当您将 Windows 转到 linux 时,这显然存在问题。一般来说,我自己在以这种方式解析主机名时遇到了很多可靠性问题,建议您不要使用它。正如 DTB 指出的那样,您只需要 IP 地址即可连接。如果您出于其他原因需要主机名,那么最安全的做法是让您的服务器在您的客户端首次连接时向您的客户端发送其主机名(反之亦然)

于 2012-05-10T18:45:42.703 回答