我有一个 iPad 应用程序,我在其中创建和连接 posix socket
。当远程设备拒绝连接尝试时,呼叫connect(...)
未按预期响应。
我如何创建和连接的简化示例socket
:
struct sockaddr_in server;
server.sin_family = AF_INET;
int socket = socket(AF_INET, SOCK_STREAM, 0);
if(socket < 0)
{
NSLog(@"socket create failed: %s", strerror(errno));
}
else if(inet_aton(mAddress, &server.sin_addr))
{
server.sin_port = htons(mPortNumber);
if(connect(socket, (struct sockaddr *)&server, sizeof(server)) == -1)
{
NSLog(@"connect() failed: %s", strerror(errno));
}
else
{
NSLog(@"connect() succeeded");
}
}
在大多数情况下,上述示例有效:例如,对于正在接受连接的远程设备(以下称为“服务器”),按预期connect()
返回。0
对于不存在的地址,connect()
阻塞一段时间然后返回-1
,并且errno
是ETIMEDOUT
。
从文档中,如果服务器拒绝连接尝试,我希望connect()
返回-1
并且 for errno
to beECONNREFUSED
或也许ECONNRESET
. 相反,connect()
返回0
.
我已经多次对 TCP 会话进行 WireSharked,并且可以确认它只包含两个数据包:
客户端 (iPad) -> 服务器:
SYN, ACK
服务器 -> 客户端(iPad):
RST, ACK
为什么连接返回0
?
更新:从不同的客户端连接到同一服务器,例如 Windows 上的 Qt(winsock?)或 Mac OSX(也是 posix)按预期工作:即connect()
返回-1
, ECONNREFUSED
. 这让我相信这是 iPad 端而不是服务器端的问题。