CentOS 7环境下socket编程出现connection refuse的情况及解决办法

不知道大家有没有在centos7的环境下编写socket程序的时候出现connection refuse这种情况?

以下是出现这个情况的一种原因和解决办法:

问题产生的原因

首先,Connection refused信息是通过strerror(errno)输出的,strerror()在<string.h>中,errno在<errno.h>中。

对于服务端:服务端中,如果端口设定是通过htonl(xxxx)。事实上,sockaddr_in.sin_port为短整型,占16位;且CentOS7系统采用的字节序为小端字节序。因此,htonl(xxxx)的实际结果为0而非xxxx的网络字节序。由于端口的实际值为0,这会导致当服务端调用函数listen时,内核会为服务端选择一个临时端口,这个临时端口通常与我们所指定的端口并不相同。

对于客户端:事实上,客户端所请求的端口号为0(保留端口)。当客户端在调用函数connect时,服务器端在客户端所请求的端口上没有服务在等待连接,所以connect最终出错返回,出错的原因正如我们所看到的:Connection refused。

解决办法

将htonl(xxxx)替换成hons(xxxx),分别实施于服务器与客户端。

总结

引起Connection refused的可能原因:服务端在客户端所请求的端口上没有服务在等待连接。

也许是服务端根本没有启动;也许是服务端启动成功了,但客户端所请求的端口与服务端正在监听的端口不一致(客户端所请求的端口并不一定与我们所指定的一致,服务端正在监听的端口也并不一定与我们所指定的一致,这正是本文所讨论的内容)。当然,不排除还存在其他情况会导致此错误。

猜你喜欢

转载自blog.csdn.net/lws123253/article/details/81317539