sam*_*m-w 7 c sockets posix tcp ios
我有一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,上述示例有效:例如,对于正在接受连接的远程设备(以下称为"服务器"),按预期connect()返回0.对于不存在的地址,connect()一段时间的块然后返回-1,并且errno是ETIMEDOUT.
从文档,如果服务器拒绝连接尝试我希望connect()返回-1并errno成为ECONNREFUSED或可能ECONNRESET.相反,connect()返回0.
我已经多次WireSharked TCP会话,并且可以确认只包含两个数据包:
客户端(iPad) - >服务器:
SYN, ACK服务器 - >客户端(iPad):
RST, ACK
为什么连接会返回0?
更新:从不同的客户端连接到同一台服务器,例如Windows上的Qt(winsock?)或Mac OSX(也是posix)按预期工作:即connect()返回-1,ECONNREFUSED.这让我相信这是iPad端而不是服务器端的问题.
我认为你应该像这样创建套接字,注意第三个参数。
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Run Code Online (Sandbox Code Playgroud)
归根结底,connect() 对于被拒绝的连接返回 0 并不重要。考虑一下:假设 connect() 成功,tcp 连接已建立并且调用返回 0。但是,在代码更改为在套接字上调用 write 或 read 之前,服务器会立即重置或断开连接。下一次写入失败并显示 EPIPE,并且读取返回 0。无论如何,您都需要处理这种情况。
我假设您已经阅读过本文,但请注意在 iOS 中使用 POSIX 套接字有更多警告:https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html
| 归档时间: |
|
| 查看次数: |
1242 次 |
| 最近记录: |