0

(我没有在这个问题中输入代码,因为实际代码在这里可能无关紧要。如果你说它确实如此,那么我可以稍后编辑问题以将其放入。)

我不熟悉使用 winsock2 或任何其他网络 API 来解决这个问题。我有一个非常简单的服务器应用程序和客户端应用程序,其中服务器向客户端发送一个字符串,然后断开连接。

当我使用localhost127.0.0.1作为inet_addr()参数时,应用程序工作正常,但是当我使用我的“真实”IP 时,客户端应用程序只是获取WSAECONNREFUSED而服务器看不到它。我确保两个应用程序的端口相同,并且协议也相同。

[编辑] 在放弃网络一段时间后,我又回到了这个问题。我认为这实际上可能与我使用路由器的事实有关,而不是我的代码中的某些东西。

4

2 回答 2

1

WSAECONNREFUSED是对等方或中间防火墙主动拒绝连接。如果是对方发出的,说明你的 IP 地址或端口错了,或者你没看错,但服务器实际上并没有运行;无论如何,在那个 IP:port 上没有任何东西在监听。如果是防火墙,请调整它。

htons()在端口号上使用了吗?

于 2013-10-07T01:09:48.863 回答
0

inet_addr()仅适用于 IP 地址字符串,您必须使用gethostbyname()或将任何其他主机名字符串getaddrinfo()解析为 IP 地址。localhost

WSACONNREFUSED表示连接在您尝试连接的远程端被主动拒绝。

如果服务器机器拒绝,这意味着在请求的 IP:Port 上没有侦听套接字,或者有一个但其挂起的客户端连接队列已满,因此此时它无法接受新连接。

如果路由器拒绝,这通常意味着路由器未配置为将请求的 IP:Port 的入站连接转发到路由器网络上的机器。如果您有一个在路由器后面运行的服务器并尝试使用路由器的公共 IP 地址连接到它,则必须设置路由器以进行端口转发。

如果防火墙拒绝,这通常意味着请求的端口未打开。

无论哪种方式,客户端都无法在代码中知道连接被拒绝的原因。它所能做的就是等待一段时间,然后再试一次。

于 2014-01-19T19:43:52.217 回答