套接字应用程序无法在互联网上工作

Socket application does not work over the internet

本文关键字:互联网 工作 应用程序 套接字      更新时间:2023-10-16

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

我真的不知道现在该怎么办。。。我可以从我的电脑ping我的windows服务器,我可以从windows服务器ping我的电脑,但不可能连接到我的应用程序。

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

任何帮助都将不胜感激,谢谢!

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

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

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

代码使用getaddrinfo,需要主机名而不是IP地址。

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

确保名称解析有效:

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

确保连接:

在服务器命令行上:

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

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

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

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