Iphone ios-确定是否可以访问具有特定端口的特定地址
我想知道我的服务器是否通过ios应用程序在线。以下是我正在做的:Iphone ios-确定是否可以访问具有特定端口的特定地址,iphone,ios,objective-c,ipad,network-programming,Iphone,Ios,Objective C,Ipad,Network Programming,我想知道我的服务器是否通过ios应用程序在线。以下是我正在做的: Boolean result; CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFDataRef)(serverIPAddress)); //serverIPAdress = "10.10.10.100:5010" if(hostRef) { result = CFHostStartInfoResolutio
Boolean result;
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFDataRef)(serverIPAddress)); //serverIPAdress = "10.10.10.100:5010"
if(hostRef) {
result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed
}
if (!result) { //This means that the host was unreachable
return ;
}
我的服务器是在线的,我可以稍后在代码中访问它(这意味着我与服务器的连接工作得非常好)。但是,我希望能够检测到某个端口上的服务器是否可以访问
此外,如果我从ip地址中删除“:5010
”,它会检测到我的服务器处于联机状态(它不会进入“!result
”状态),并且如果我在网络上放置“10.10.10.253
”,它会检测到我的服务器处于脱机状态,这与我的网络上没有ip地址对应
如何确定我的服务器是否联机
我已经研究过这个问题:但它不起作用,因为它总是返回无论我输入什么ip地址都是可访问的
提前感谢一种方法是打开到特定端口的套接字连接,看看是否有响应。如果没有,则无法到达目的地。比如说
#include <arpa/inet.h> //for PF_INET, SOCK_STREAM, IPPROTO_TCP etc
CFRunLoopSourceRef gSocketSource;
void ConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
UInt8 buffer[1024];
bzero(buffer, sizeof(buffer));
CFSocketNativeHandle sock = CFSocketGetNative(socket); // The native socket, used recv()
//check here for correct connect output from server
recv(sock, buffer, sizeof(buffer), 0);
printf("Output: %s\n", buffer);
if (gSocketSource)
{
CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
if (CFRunLoopContainsSource(currentRunLoop, gSocketSource, kCFRunLoopDefaultMode))
{
CFRunLoopRemoveSource(currentRunLoop, gSocketSource, kCFRunLoopDefaultMode);
}
CFRelease(gSocketSource);
}
if (socket) //close socket
{
if (CFSocketIsValid(socket))
{
CFSocketInvalidate(socket);
}
CFRelease(socket);
}
}
void ConnectSocket()
{
//socket
CFSocketContext context = {0, NULL, NULL, NULL, NULL};
CFSocketRef theSocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack , (CFSocketCallBack)ConnectCallBack, &context);
//address
struct sockaddr_in socketAddress;
memset(&socketAddress, 0, sizeof(socketAddress));
socketAddress.sin_len = sizeof(socketAddress);
socketAddress.sin_family = AF_INET;
socketAddress.sin_port = htons(5010);
socketAddress.sin_addr.s_addr = inet_addr("10.10.10.253");
gSocketSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, theSocket, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), gSocketSource, kCFRunLoopDefaultMode);
CFDataRef socketData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&socketAddress, sizeof(socketAddress));
CFSocketError status = CFSocketConnectToAddress(theSocket, socketData, 30); //30 second timeout
//check status here
CFRelease(socketData);
}
#包括//用于PF_INET、SOCK_流、IPPROTO_TCP等
CFRunLoopSourceRef gSocketSource;
void ConnectCallBack(CFSocketRef套接字、CFSocketCallBackType、CFDataRef地址、const void*数据、void*信息)
{
UInt8缓冲区[1024];
bzero(缓冲区,sizeof(缓冲区));
CFSocketNativeHandle sock=CFSocketGetNative(socket);//本机套接字,used recv()
//在此处检查服务器的正确连接输出
recv(sock,buffer,sizeof(buffer),0);
printf(“输出:%s\n”,缓冲区);
if(gSocketSource)
{
CFRunLoopRef currentloop=CFRunLoopGetCurrent();
if(CFRunLoopContainsSource(currentRunLoop、gSocketSource、kCFRunLoopDefaultMode))
{
CFRunLoopRemoveSource(currentRunLoop、gSocketSource、kCFRunLoopDefaultMode);
}
CFRelease(gSocketSource);
}
if(socket)//关闭socket
{
if(CFSocketIsValid(socket))
{
cfsocket(socket);
}
cfc释放(插座);
}
}
void ConnectSocket()
{
//插座
CFSocketContext上下文={0,NULL,NULL,NULL,NULL};
CFSocketRef theSocket=CFSocketCreate(kcfolocatordefault、PF_INET、SOCK_STREAM、IPPROTO_TCP、kCFSocketConnectCallBack、(CFSocketCallBack)ConnectCallBack和context);
//地址
socketAddress中的结构sockaddr_;
memset(&socketAddress,0,sizeof(socketAddress));
socketAddress.sin_len=sizeof(socketAddress);
socketAddress.sin_family=AF_INET;
socketAddress.sinu端口=htons(5010);
socketAddress.sin_addr.s_addr=inet_addr(“10.10.10.253”);
gSocketSource=CFSocketCreateRunLoopSource(KCfallocator默认值,存储库,0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),gSocketSource,kCFRunLoopDefaultMode);
CFDataRef socketData=CFDataCreate(kcfolocatordefault,(const UInt8*)和socketAddress,sizeof(socketAddress));
CFSocketError status=CFSocketConnectToAddress(socket,socketData,30);//30秒超时
//在此处检查状态
CFRelease(socketData);
}
基本上,如果无法在该端口访问服务器,则很可能会获得CfsocketTimeout for CFSocketError状态。如果您希望解析来自服务器的特定响应,以确定服务器是否准备就绪,则在套接字连接成功时将调用ConnectCallBack函数
这只是一个简单的示例,请确保不要通过调用主线程上的套接字连接(如recv())来阻塞UI。一种方法是打开到特定端口的套接字连接,以查看是否返回任何响应。如果没有,则无法到达目的地。比如说
#include <arpa/inet.h> //for PF_INET, SOCK_STREAM, IPPROTO_TCP etc
CFRunLoopSourceRef gSocketSource;
void ConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
UInt8 buffer[1024];
bzero(buffer, sizeof(buffer));
CFSocketNativeHandle sock = CFSocketGetNative(socket); // The native socket, used recv()
//check here for correct connect output from server
recv(sock, buffer, sizeof(buffer), 0);
printf("Output: %s\n", buffer);
if (gSocketSource)
{
CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
if (CFRunLoopContainsSource(currentRunLoop, gSocketSource, kCFRunLoopDefaultMode))
{
CFRunLoopRemoveSource(currentRunLoop, gSocketSource, kCFRunLoopDefaultMode);
}
CFRelease(gSocketSource);
}
if (socket) //close socket
{
if (CFSocketIsValid(socket))
{
CFSocketInvalidate(socket);
}
CFRelease(socket);
}
}
void ConnectSocket()
{
//socket
CFSocketContext context = {0, NULL, NULL, NULL, NULL};
CFSocketRef theSocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack , (CFSocketCallBack)ConnectCallBack, &context);
//address
struct sockaddr_in socketAddress;
memset(&socketAddress, 0, sizeof(socketAddress));
socketAddress.sin_len = sizeof(socketAddress);
socketAddress.sin_family = AF_INET;
socketAddress.sin_port = htons(5010);
socketAddress.sin_addr.s_addr = inet_addr("10.10.10.253");
gSocketSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, theSocket, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), gSocketSource, kCFRunLoopDefaultMode);
CFDataRef socketData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&socketAddress, sizeof(socketAddress));
CFSocketError status = CFSocketConnectToAddress(theSocket, socketData, 30); //30 second timeout
//check status here
CFRelease(socketData);
}
#包括//用于PF_INET、SOCK_流、IPPROTO_TCP等
CFRunLoopSourceRef gSocketSource;
void ConnectCallBack(CFSocketRef套接字、CFSocketCallBackType、CFDataRef地址、const void*数据、void*信息)
{
UInt8缓冲区[1024];
bzero(缓冲区,sizeof(缓冲区));
CFSocketNativeHandle sock=CFSocketGetNative(socket);//本机套接字,used recv()
//在此处检查服务器的正确连接输出
recv(sock,buffer,sizeof(buffer),0);
printf(“输出:%s\n”,缓冲区);
if(gSocketSource)
{
CFRunLoopRef currentloop=CFRunLoopGetCurrent();
if(CFRunLoopContainsSource(currentRunLoop、gSocketSource、kCFRunLoopDefaultMode))
{
CFRunLoopRemoveSource(currentRunLoop、gSocketSource、kCFRunLoopDefaultMode);
}
CFRelease(gSocketSource);
}
if(socket)//关闭socket
{
if(CFSocketIsValid(socket))
{
cfsocket(socket);
}
cfc释放(插座);
}
}
void ConnectSocket()
{
//插座
CFSocketContext上下文={0,NULL,NULL,NULL,NULL};
CFSocketRef theSocket=CFSocketCreate(kcfolocatordefault、PF_INET、SOCK_STREAM、IPPROTO_TCP、kCFSocketConnectCallBack、(CFSocketCallBack)ConnectCallBack和context);
//地址
socketAddress中的结构sockaddr_;
memset(&socketAddress,0,sizeof(socketAddress));
socketAddress.sin_len=sizeof(socketAddress);
socketAddress.sin_family=AF_INET;
socketAddress.sinu端口=htons(5010);
socketAddress.sin_addr.s_addr=inet_addr(“10.10.10.253”);
gSocketSource=CFSocketCreateRunLoopSource(KCfallocator默认值,存储库,0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),gSocketSource,kCFRunLoopDefaultMode);
CFDataRef socketData=CFDataCreate(kcfolocatordefault,(const UInt8*)和socketAddress,sizeof(socketAddress));
CFSocketError status=CFSocketConnectToAddress(socket,socketData,30);//30秒超时
//在此处检查状态
CFRelease(socketData);
}
基本上,如果无法在该端口访问服务器,则很可能会获得CfsocketTimeout for CFSocketError状态。如果您希望解析来自服务器的特定响应以确定服务器是否准备就绪,则将调用ConnectCallBack函数