在我的iOS应用中,我想在localhost上连接套接字。它在模拟器上工作正常但在设备上没有。 我创建了一个侦听localhost的套接字:
// 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;
}
在我的应用程序的另一部分,我创建另一个套接字并尝试在localhost上连接它:
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));
此代码在Simulator上运行正常。但是在设备上我在连接上遇到错误:“没有这样的文件或目录”。
这段代码不正确吗?或者它是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));
答案 0 :(得分:1)
模拟器在同一台机器(localhost)上运行,但不在设备上运行。对于设备,您可能需要使用机器的IP地址进行连接,而不是使用本地主机' 127.0.0.1'
希望有所帮助。