Tôi có một ứng dụng iPad mà tôi đang tạo và kết nối một posix socket
. Các cuộc gọi đến connect(...)
không phản hồi như mong đợi khi thiết bị từ xa từ chối nỗ lực kết nối.socket connect() trả về 0 ngay cả sau khi thiết lập lại ngang hàng
Một ví dụ đơn giản về cách tôi tạo ra và kết nối 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");
}
}
Trong hầu hết các trường hợp, ví dụ trên hoạt động: ví dụ đối với thiết bị từ xa (sau đây được gọi là 'máy chủ') đang chấp nhận kết nối, connect()
trả về 0
như mong đợi. Đối với địa chỉ không tồn tại, connect()
khối trong một thời gian sau đó trả lại -1
và errno
là ETIMEDOUT
.
Từ các tài liệu, nếu máy chủ từ chối nỗ lực kết nối tôi mong chờ connect()
trở -1
và cho errno
là ECONNREFUSED
hoặc có lẽ ECONNRESET
. Thay vào đó, connect()
trả lại 0
.
Tôi đã WireSharked cuộc nói chuyện TCP nhiều lần và có thể khẳng định rằng chỉ có bao giờ bao gồm hai gói:
Khách hàng (iPad) -> Server:
SYN, ACK
Server -> Client (iPad) :
RST, ACK
Tại sao kết nối trả lại 0
?
Cập nhật: Kết nối với cùng một máy chủ từ một ứng dụng khách khác, ví dụ: Qt trên Windows (winsock?) Hoặc Mac OSX (cũng posix) hoạt động như mong đợi: tức là connect()
trả lại -1
, ECONNREFUSED
. Điều này khiến tôi tin rằng đó là vấn đề với kết thúc iPad thay vì kết thúc máy chủ.
"* ... nếu thiết bị từ xa từ chối nỗ lực kết nối ... *" Tôi không chắc chắn nếu 'để từ chối' là một hành động được xác định rõ ràng của thiết lập kết nối TCP/IP, vì vậy bạn có thể muốn xây dựng về cách bạn xác định nó. – alk
Ý tôi là từ 'kết nối bị từ chối' là một cuộc hội thoại TCP giống như ở trên, tức là khách hàng cố gắng 'SYN' và máy chủ trả lời bằng' RST'. Bạn sẽ sử dụng thuật ngữ nào để mô tả điều này? – sjwarner
Không có 'SYN-ACK' từ điều khiển từ xa để chuyển sang SYN của iPad? – alk