(我没有在这个问题中放入代码,因为实际的代码在这里可能并不重要。但是,如果您说它确实如此,那么我可以稍后编辑问题以将其放入其中。)
我对使用winsock2或任何其他网络应用程序接口都是新手。我有一个非常简单的服务器应用程序和客户端应用程序,其中服务器向客户端发送一个字符串,然后断开连接。
当我使用localhost
或127.0.0.1
作为inet_addr()
参数时,应用程序工作得很好,但是当我使用我的“真实”IP时,客户机应用程序只得到WSAECONNREFUSED
,服务器看不到它。我确保两个应用程序的端口是相同的,协议也是相同的。
编辑在放弃网络一段时间后,我又回到了这个问题上。我认为这实际上可能与我使用路由器的事实有关,而不是我的代码中的某些内容。
发布于 2013-10-07 01:09:49
WSAECONNREFUSED
是对等设备或中间防火墙主动拒绝连接。如果它是发出它的对等体,这意味着您获得了错误的IP地址或端口,或者您获得了正确的IP地址或端口,但服务器并未实际运行;无论如何,没有任何东西在该IP:port上侦听。如果是防火墙,请调整它。
您是否在端口号上使用了htons()
?
发布于 2014-01-19 19:43:52
inet_addr()
仅适用于IP地址字符串,您必须使用gethostbyname()
或getaddrinfo()
将localhost
或任何其他主机名字符串解析为IP地址。
WSACONNREFUSED
表示连接在您尝试连接的远程端被主动拒绝。
如果服务器正在拒绝,这意味着没有套接字在请求的IP:端口上侦听,或者有一个套接字,但它的挂起客户端连接队列已满,因此此时它无法接受新的连接。
如果路由器拒绝,这通常意味着路由器未配置为将请求的IP:端口的入站连接转发到路由器网络上的机器。如果您有一台在路由器后面运行的服务器,并且正在尝试使用路由器的公共IP地址连接到它,则必须将路由器设置为端口转发。
如果防火墙拒绝,这通常意味着请求的端口未打开。
无论哪种方式,客户端都无法在代码中知道连接被拒绝的原因。它所能做的就是等待一段时间,然后重试。
https://stackoverflow.com/questions/19215748
复制