Iphone 在iOS上的localhost上连接套接字

Iphone 在iOS上的localhost上连接套接字,iphone,ios,sockets,localhost,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);

在我的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));
在我的应用程序的另一部分中,我创建了另一个套接字并尝试在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;
}
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的限制

谢谢你的帮助

编辑:

设置套接字选项以便使用loopback似乎可以解决问题:

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”


希望能有所帮助。

我非常推荐使用AsyncSocket