套接字应用程序无法通过互联网运行

问题描述 投票:0回答:2

我在套接字编程中遇到了问题。我目前正在编写一个简单的服务器/客户端应用程序,它要求连接的客户端回答一项调查(我正在遵循书中的练习:C 中的 TCP/IP 套接字:程序员实用指南)。它在我的本地网络中工作正常(使用本地主机进行连接),但我无法使其在互联网上工作。 由于我更改了书中的一些代码,因此我尝试编译书中的原始源代码,但仍然无法正常工作。我认为这不是代码问题,而是网络问题。 我做了一些研究,所以我关闭了防火墙,我转发了我在路由器中使用的端口(12543),但它仍然不起作用...我有一个运行 Windows 7 的远程 Windows 服务器进行测试:当我在其上运行我的服务器并尝试从我的计算机连接时,它失败了,当我尝试从我的计算机运行我的服务器并尝试从远程 Windows 服务器连接时:它再次失败。即使当我在计算机上运行服务器并尝试使用我的私有 IPv4 地址 192.168.x.x 或公共地址从同一台计算机连接客户端时,它也会失败!哦,Windows 服务器上没有运行防火墙。

我现在真的不知道该怎么办...我可以从我的计算机 ping 我的 Windows 服务器,我可以从我的 Windows 服务器 ping 我的计算机,但无法连接到我的应用程序。

源代码可以在这里找到:http://cs.ecs.baylor.edu/~donahoo/practical/CSockets2/textcode.html(SurveyServer2.cpp,SurveyClient2.cpp,SurveyCommon.h),但我不知道不认为是代码问题。 如果还不够清楚,请告诉我。如果我犯了一些语法错误,请原谅,我是法国人!

如有任何帮助,我们将不胜感激,谢谢!

编辑: 好的,我知道发生了什么事:这是 IPv4 和 IPv6 之间的兼容性问题!它还不能正常工作,但我现在知道要修复什么。谢谢大家:)

第二次编辑:好吧,我想我终于明白了。我将服务器绑定到 IPv6 地址,但运行服务器的主机只有公共 IPv4 地址。当我尝试连接时,DNS 解析仅返回 IPv4 地址,因此我无法连接到我的服务器。我告诉 getaddrinfo 仅返回 IPv4 地址,所以现在它绑定到 IPv4 地址并且工作正常。

肯定有一种方法可以将 IPv6 地址添加到我的主机,但我认为我不需要它,它现在工作正常,我希望这不会造成任何麻烦。

c++ sockets
2个回答
1
投票

该代码使用了

getaddrinfo
并且需要主机名而不是 IP 地址。


0
投票

听起来确实存在连接问题或 DNS 问题。

确保名称解析正常工作:

在客户端计算机的命令行上输入“ping server_NAME”。 如果找不到服务器名称的 IP 地址,则可能是您的问题。

确保连接:

在服务器命令行上:

输入“netstat -an -p TCP”。这将显示所有正在侦听的程序及其端口号的列表。您应该看到您的服务器正在侦听端口 12543。

在运行客户端程序的机器上:

使用telnet查看是否可以连接到服务器。您可以使用命令行选项设置 telnet 使用的端口号。通常类似于“telnet -p 12543 server-ip”。如果显示“连接被拒绝”,则存在连接问题(防火墙等)。如果它打开连接,您将不会收到错误消息,并且您将能够键入要发送到服务器的文本。你真的只关心 telnet 是否能够在这里建立 TCP 连接。

如果 Telnet 确实连接,那么您的问题是程序之间的通信,而不是网络问题。

© www.soinside.com 2019 - 2024. All rights reserved.