Iphone 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

我想知道我的服务器是否通过ios应用程序在线。以下是我正在做的:

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函数