警告:stream_socket_client(),php_network_getaddresses getaddrinfo 失败,未提供节点名称或服务名称未知。

4
当我处于联网状态时,一切正常。但当没有网络连接时,以下代码会出现错误:
$socket_context = stream_context_create($options);

$this->smtp_conn = @stream_socket_client($host.":".$port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context);

我故意不连接到互联网,但是当用户没有连接到互联网时,我希望在iOS应用程序中向用户显示alertView,内容如下:

您未连接到互联网

而非

警告:stream_socket_client(),php_network_getaddresses getaddrinfo失败nodename nor serv name provided or notknown

那么我该如何处理这个错误?

// -------------- Code where I am setting NSStream in .m file :----------

#import "LoginViewController.h"

// --------------- here I set the delegate -------------
@interface LoginViewController () <NSStreamDelegate>

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{

}

任何帮助都将不胜感激。

你不希望 iPhone/iPad 未连接到互联网,而不是你正在 ping 的服务器吗? - DevZer0
@DevZer0:显然我想要连接互联网。但是当没有连接到互联网时,我希望抛出错误。 - Ponting
1
那么,当你真正需要的是来自IOS的状态处理程序时,为什么PHP会介入呢? - DevZer0
@DevZer0:我之前以错误的方式告诉了你...对此感到抱歉。在我的情况下,iPhone 已连接到互联网,但如果由于任何原因服务器宕机,则我想要抛出错误或处理该错误,并将该错误显示给 iPhone。 - Ponting
听起来你想做的是让连接到你的服务器的iOS应用在连接失败时向用户显示错误信息?我理解得对吗? - Carl Veazey
@CarlVeazey:是的,没错。当服务器无法连接到互联网时,向用户显示警报。 - Ponting
2个回答

2
假设您正在使用NSStream来连接您的套接字。在您的委托方法中:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

如果套接字出现错误,您将收到通知:
case NSStreamEventErrorOccurred:

或者
case NSStreamEventEndEncountered:

在这种情况下,您可以向用户显示网络错误。但是,如果他们失去互联网连接,您只有在尝试通过套接字发送一些数据时才会知道。因此,为了解决这个问题,您应该实现Reachability。 Github项目 或者使用苹果的帮助类。 Apple Reachability 当没有连接时,您将收到通知,以及当有连接时,允许您根据需要通知用户。
希望我理解得正确。

我需要设置任何委托来调用这个方法吗? - Ponting
是的,创建套接字的类可以处理委托方法。@Ponting,这是你的参考文档。http://developer.apple.com/library/ios/documentation/cocoa/reference/NSStreamDelegate_Protocol/Reference/Reference.html - sbarow
我也实现了NSStreamDelegate协议。 - Ponting
你能否发布一下你设置NSStreams的代码? - sbarow
我正在使用NSURLConnection连接服务器。 - Ponting
显示剩余3条评论

1

等等...所以在你的情境中,iPhone应用是“socket服务器”,而PHP则是“socket客户端”。我理解得对吗?

如果是这样的话...你已经用“@”将错误信息消除了。唯一剩下的就是简单地检查返回值是否为false,例如:

$socket_context = stream_context_create($options);

$this->smtp_conn = @stream_socket_client($host.":".$port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context);
if (false === $this->smtp_conn) {
    //Handle the error here
    echo 'You are not connected to internet';
}

如果使用“@”运算符让你感到不舒服(应该这样),你也可以在调用之前使用set_error_handler(),如果出现错误,则在那里处理错误,最后将错误处理程序恢复到先前的状态。

我在这一行遇到了错误:$this->smtp_conn = @stream_socket_client($host.":".$port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context)。因此,此行之后的代码将不会被执行。所以,在此行之后提出的解决方案是没有意义的。您能详细说明如何使用set_error_handler()解决问题吗?谢谢。 - Ponting
如果是致命错误,那么set_error_handler()无法帮助您从中恢复,但它至少可以让您以自定义消息作为输出结束。如果是非致命错误(即“警告”,根据您的原始帖子),则应无论如何执行以下行,因此上述内容将起作用。 - boen_robot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接