iphone - 在 iOS 上连接本地主机上的套接字

标签 iphone ios sockets localhost

在我的 iOS 应用程序中,我想连接本地主机上的套接字。它在模拟器上运行良好,但在设备上运行不佳。 我创建了一个监听本地主机的套接字:

// create local socket 
SOCKET newSocket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in localaddr;
localaddr.sin_family = AF_INET; 
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);    
localaddr.sin_port = htons(8080);
if (bind(newSocket, (struct sockaddr*)&localaddr, sizeof(localaddr)) != 0)
{    
    NSLog(@"bind main socket failed: %s", strerror(errno));
    return INVALID_SOCKET;
}
if(listen(newSocket, MAX_PENDING_SOCKETS) != 0)
{
    NSLog(@"listen main socket failed: %s", strerror(errno));
    return INVALID_SOCKET;
}

在我的应用程序的另一部分,我创建了另一个套接字并尝试在本地主机上连接它:

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in remoteaddr = {0};
remoteaddr.sin_family = AF_INET; 
remoteaddr.sin_addr.s_addr = inet_addr("127.0.0.1");   
remoteaddr.sin_port = htons(8080);     

int error = connect(sock, (struct sockaddr*)&remoteaddr, sizeof(remoteaddr));

此代码在模拟器上运行良好。但是在设备上,我在连接时收到错误消息:“没有这样的文件或目录”。

这段代码不正确吗?还是 iOS 的限制?

感谢您的帮助。

编辑:

似乎设置套接字选项SO_USELOOPBACK 解决了问题:

int sockopt=1;
if(setsockopt(sock, SOL_SOCKET, SO_USELOOPBACK, (char*)&sockopt, sizeof(sockopt)))
    NSLog(@"error on setsockopt SO_USELOOPBACK: %s", strerror(errno));

最佳答案

模拟器在同一台机器(本地主机)上运行,但不是设备。对于设备,您可能需要使用机器的 IP 地址进行连接,而不是“localhost”/“127.0.0.1”

希望对您有所帮助。

关于iphone - 在 iOS 上连接本地主机上的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063099/

相关文章:

ios - 如何在一个 UIButton 中实现启动和停止操作?

ios - Apple iOS 生产证书 - [ KeyChain Group ]

c++ - 套接字客户端使用服务器接受的连接发送

javascript - Socket.IO 和 IE8 - jsonp 轮询连接总是失败

iphone - 如何在 Iphone 中单击 UIButton 时设置 UiScrollView Frame?

iphone - 当内存警告不足时,通过界面构建​​器添加的 View 会发生什么情况?

iphone - 如何在objective-c/cocoa touch中进行模运算?

iphone - 使用 ad hoc 网络发送消息

ios - 隐藏纵向的 UISplitViewController 覆盖

Java套接字: Application with both server and client on same machine