ios - 套接字连接()即使在对等重置后也返回 0

标签 ios c sockets tcp posix

我有一个 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()会阻塞一段时间然后返回-1errnoETIMEDOUT.

根据文档,如果服务器拒绝连接尝试,我希望 connect() 返回 -1 并且 errnoECONNREFUSED 或者 ECONNRESET。相反,connect() 返回 0

我多次使用 WireSharked 进行 TCP 对话,可以确认它只包含两个数据包:

Client (iPad) -> Server: SYN, ACK

Server -> Client (iPad) : RST, ACK

为什么连接返回 0

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

最佳答案

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

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

归根结底,连接被拒绝时 connect() 返回 0 真的无关紧要。考虑一下:假设 connect() 成功,建立了 tcp 连接并且调用返回 0。但是,在您的代码更改为在套接字上调用 write 或 read 之前,服务器会立即重置或断开连接。下一次写入失败并返回 EPIPE,读取返回 0。 无论如何,您都需要处理这种情况。

我假设您已经读过这篇文章,但请注意在 iOS 中使用 POSIX 套接字的更多注意事项:https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html

关于ios - 套接字连接()即使在对等重置后也返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18573823/

相关文章:

c++ - static const char * const 和 static const char [] 有什么区别?

c - 从二维数组发出读取输入数据

java - Java 的 DatagramSockets 会失效还是可以永远使用而不会出现问题?

c++ - boost asio 打开更多的一个套接字

ios - 在多线程 Swift 中处理来自 AVFoundation 的视频帧

ios - 如何推送以编程方式创建的 UINavigationController 的新 View 宽度?

ios - 传递给 UIButton#addTarget 的方法未调用

c++ - Linux 如何知道进程使用了​​多少物理内存?

javascript - agent.maxSockets 的真正含义是什么?

iphone - iPhone中的ZLib无法解压数据