Ios 套接字连接()即使在对等重置后仍返回0

Ios 套接字连接()即使在对等重置后仍返回0,ios,c,sockets,tcp,posix,Ios,C,Sockets,Tcp,Posix,我有一个iPad应用程序,我正在其中创建并连接一个posixsocket。当远程设备拒绝连接尝试时,对连接(…)的调用未按预期响应 我如何创建和连接套接字的简化示例: 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&quo

我有一个iPad应用程序,我正在其中创建并连接一个posix
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");
  }
}
服务器中的结构sockaddr\u; server.sinu family=AF\u INET; int socket=socket(AF_INET,SOCK_STREAM,0); 如果(插座<0) { NSLog(@“套接字创建失败:%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()失败:%s”,strerror(errno)); } 其他的 { NSLog(@“connect()成功”); } }
在大多数情况下,上述示例都有效:例如,对于正在接受连接的远程设备(以下称为“服务器”),
connect()
按预期返回
0
。对于不存在的地址,
connect()
阻塞一段时间,然后返回
-1
errno
ETIMEDOUT

从文档中,如果服务器拒绝连接尝试,我希望
connect()
返回
-1
,并且
errno
econnreference
或者
econnreferet
。相反,
connect()
返回
0

我已经对TCP对话进行了多次无线共享,并且可以确认只有两个数据包:

客户端(iPad)->服务器:
SYN,ACK

服务器->客户端(iPad):
RST,ACK

为什么connect返回
0


更新:从不同的客户端连接到同一服务器,例如Windows上的Qt(winsock?)或Mac OSX(也是posix)按预期工作:即
connect()
返回
-1
econnrefluse
。这让我相信这是iPad端的问题,而不是服务器端的问题。

我认为应该这样创建套接字,注意第三个参数

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
归根结底,connect()对于被拒绝的连接返回0并不重要。考虑这一点:假设连接()成功,TCP连接被建立,调用返回0。但是,在您的代码更改为调用套接字上的写或读之前,服务器会立即重置或断开连接。下一次写入失败,EPIPE和read返回0。 你无论如何都要处理这个案子


我想您已经读过了,但是请注意,在iOS中使用POSIX套接字时还有更多的注意事项:

“…如果远程设备拒绝连接尝试…”我不确定
拒绝
是否是tcp/ip连接设置中定义良好的操作,因此,您可能需要详细说明如何定义它。我所说的“拒绝连接”是指与上述TCP会话类似的连接,即客户端尝试
SYN
,服务器使用
RST
进行响应。您会用什么术语来描述这一点?没有
SYN-ACK
从遥控器到iPad的SYN?没有,只有
RST,ACK
,如上所述。如果有帮助的话,我会尝试连接完整的wireshark输出?我不敢提及这一点,但iPad中似乎肯定有东西坏了。为
SYN
获取立即的
RST
应该会导致客户端的
econnrefered