簡體   English   中英

在iOS上的localhost上連接套接字

[英]Connect a socket on localhost on iOS

在我的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));

模擬器在同一台機器(localhost)上運行,但不在設備上運行。 對於設備,您可能需要使用計算機的IP地址進行連接,而不是“localhost”/“127.0.0.1”

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM