通过mysql_connect()和telnet连接到主机是偶然的成功,但是我总是可以ping主机成功?

当我尝试使用mysql_connect();连接到局域网上的主机时mysql_connect(); ,某些时候连接成功,其他时间连接失败。 我总是可以ping MySQL服务器,但是当我尝试使用telnet通过端口3306连接它时,它并不总是工作。 我可以连接到第一次3306,但不是在那之后。

 5.1.58-1ubuntu1)[n9pK8'Ym7j1Q'khH Got packets out of order Lost connection with host C:\Documents and Settings\Administrator>telnet 10.253.48.49 3306 Connecting to 10.253.48.49... Cannot open connection to the host on port 3306: Connect failed Pinging is always successful, however: Reply from 10.253.48.49: bytes=32 time<1ms TTL=64 Reply from 10.253.48.49: bytes=32 time<1ms TTL=64 Reply from 10.253.48.49: bytes=32 time<1ms TTL=64 Reply from 10.253.48.49: bytes=32 time<1ms TTL=64 Reply from 10.253.48.49: bytes=32 time<1ms TTL=64 

而且,局域网上的其他客户端可以连接到主机,即使我不能。 我可以每次成功连接到另一台主机。 我怎样才能解决这个错误?

这里的镜头很远,但是networking上是否有重复的IP地址? 即一个托pipeMySQL和一个不和你随机连接到正确的?

尝试做一个arp -a并检查你认为是正确的IP的MAC地址。 这可能需要一些尝试,但是如果你有一个重复的IP,你最终会得到一个不同的MAC地址为同一个IP。

在主机上的MySQL(我认为是运行Ubuntu,基于您的错误信息),请尝试运行此命令:

 sudo netstat -lntp | grep 3306 

你应该看到mysqld守护进程正在运行。 否则,问题可能是机器的MySQL守护进程没有运行。 我认为Ubuntu上的命令是/etc/init.d/mysql start以root身份启动,如果它没有运行,它将启动守护进程。 (我不使用Ubuntu,但是这是一个谷歌search,在Arch上它是rc.d start mysqld但它不能完全转化为Ubuntu)。

如果这不是问题,即守护程序正在主机上运行,​​则问题可能是防火墙configuration不正确,端口未打开。 试试这个命令来看端口是否打开( 这两个命令都在运行MySQL的主机上运行,​​而不是在你使用PHP的本地机器上运行)

 nmap -v -sT localhost 

如果您没有看到3306被列为打开,并且机器使用iptables作为防火墙,则该命令应该打开该端口

 iptables -I INPUT -p tcp --dport 3306 -d host.machine.ip.address -s your.machine.ip.address -j ACCEPT 

这应该允许你的客户机(运行mysql_connect() ,即使它不应该)访问MySQL主机。

另外,正如我在我的评论中提到的(对于RikudoSennin的这个提示):请不要将mysql_*函数用于新代码。 他们不再被维护,社区已经开始了贬值过程 。 看到红色的盒子 ? 相反,您应该了解准备好的语句,并使用PDO或MySQLi 。 如果你不能决定, 这篇文章会帮助你。 如果你在意学习, 这里是很好的PDO教程 。

编辑:在一些更多的在线search后,我看到ServerFault上的另一个用户用我提出的三个命令中的两个来回答这个问题,所以我连接到这个问题,因为它可能是相关的。