gpt4 book ai didi

iphone - ios - 确定具有特定端口的特定地址是否可达

转载 作者:行者123 更新时间:2023-11-29 13:19:23 25 4
gpt4 key购买 nike

我想通过我的 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 地址),则检测到我的服务器离线。

如何确定我的服务器是否在线?

我看过这个问题:Reachability with Address - Server AND Port - iOS 5但它不起作用,因为它总是返回无论我输入什么 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);
}

基本上,如果服务器在该端口无法访问,您很可能会收到一个用于 CFSocketError 状态的 kCFSocketTimeout。如果您希望解析从服务器返回的特定响应以确定服务器是否准备就绪,ConnectCallBack 函数将在套接字连接成功时被调用。

这只是一个简单的示例,请确保不要通过在主线程上调用套接字连接(例如 recv())来阻塞 UI

关于iphone - ios - 确定具有特定端口的特定地址是否可达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com