即时通讯程序 - 适用于 127.0.0.1,但不适用于其他计算机

Posted

技术标签:

【中文标题】即时通讯程序 - 适用于 127.0.0.1,但不适用于其他计算机【英文标题】:instant messaging program - works with 127.0.0.1, but not with other computers 【发布时间】:2010-08-06 18:34:51 【问题描述】:

我已经关注了http://www.codeproject.com/KB/IP/beginningtcp_cpp.aspxt上的教程

它教了如何在 c++ 中使用 winsockets,我终于设法让我的程序工作,通过使用 127.0.0.1 进行测试,我可以打开我程序的两个进程实例,然后在端口 (700) 上进行一个监听,然后使用 ip 127.0.0.1 与端口 700 上的另一个程序连接到它,然后我可以在两个程序之间毫无问题地发送消息。

我把程序发给我的朋友,得到他的 ip 并告诉他开始监听 700 端口,然后我尝试连接到他的 ip 地址和端口 700,程序冻结了大约 20 秒(因为我有它与我的窗口相同的线程)并且 connect() 函数在此处返回 SOCKET_ERROR:

if (connect(g_sock, (SOCKADDR*)&target, sizeof(target)) == SOCKET_ERROR)

    return 4;

我已经尝试过其他端口,并且我已经在 windows 防火墙上允许了它。也禁用了 windows 防火墙,禁用了 avast。

我的代码与教程中的代码几乎相同,我也下载了教程中的代码,我得到的错误与我的相同。

我使用的是 Windows 7 Ultimate 32 位

【问题讨论】:

这一切都在内部网络上吗?因为如果不是,您需要使用您的朋友访问互联网的公共 IP 地址,并将该路由器配置为将端口 700 转发到他的私有 IP 地址。 我使用的是来自whatismyip.com的互联网IP, 运行 Wireshark 并捕获流量也是一个好主意。这可以让你知道哪里出了问题。 您的朋友很可能在防火墙后面。他可以整天监听那个端口,但除非他的路由器转发到他的机器,否则它不会到达他。 很高兴听到您成功了。这并不总是关于积分。反正我还没想好怎么花。 :) 【参考方案1】:

你们中的任何一个人是否在 NAT 防火墙/路由器后面?您向外界提供的 IP 地址可能不是您自己的计算机使用的 IP 地址,这将使程序无法与您通信,除非您通过 NAT 设置了某种隧道。

【讨论】:

【参考方案2】:

您是否在 Internet 上尝试这样做?两台计算机之间可能存在防火墙。

理想情况下,您应该首先在局域网上测试您的程序。对于这种测试来说,这是一个更合适的环境。

【讨论】:

以上是关于即时通讯程序 - 适用于 127.0.0.1,但不适用于其他计算机的主要内容,如果未能解决你的问题,请参考以下文章

保存Ajax但不将CORS cookie从127.0.0.1发送到服务

SpringBoot 集成Redis pub/sub

Chrome 在本地主机上抛出 ERR_CONNECTION_RESET 但不是 127.0.0.1

Django html重定向但不加载页面

本机ip127.0.0.1和0.0.0.0区别及内环流量

flask-web—— 即时通讯 IMWebSocketSocket.IO 实时推送消息