2013-09-02 57 views
7

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 -1errnoETIMEDOUT.

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 errnoECONNREFUSED 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ủ.

+0

"* ... 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

+0

Ý 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

+0

Không có 'SYN-ACK' từ điều khiển từ xa để chuyển sang SYN của iPad? – alk

Trả lời

1

Tôi nghĩ bạn nên tạo ổ cắm như thế này, lưu ý tham số thứ ba.

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

Vào cuối ngày, kết nối() trả về 0 cho kết nối bị từ chối. Hãy xem xét điều này: Giả sử connect() thành công, kết nối tcp được thiết lập và trả về cuộc gọi 0. Tuy nhiên, máy chủ ngay lập tức reset hoặc ngắt kết nối trước khi mã của bạn thay đổi để gọi ghi hoặc đọc trên socket. Lần ghi tiếp theo không thành công với EPIPE và trả về giá trị trả lại 0. Dù sao thì bạn cũng cần xử lý trường hợp này.

tôi giả sử bạn đã đọc này, nhưng lưu ý rằng có nhiều hãy cẩn thận trong việc sử dụng ổ cắm POSIX trong iOS: https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html

Các vấn đề liên quan