2012-04-18 23 views
8

Ứng dụng của tôi tạo một kết nối TCP, Điều này đang hoạt động bình thường. Nhưng trong một mạng máy chủ đã nhiều IP nóiLỗi kết nối TCP 115 Thao tác đang diễn ra Nguyên nhân là gì?

  • 174.XXX
  • 54.xxx như thế này

Khi gọi TCP connect (Non chặn với thời gian chờ là 60 giây) sang IP 174.X.X.X luôn thành công. Nhưng TCP kết nối với cùng một máy chủ với ip 54.x.x.x là không (hầu hết các lần) với hoạt động errno 115 measn đang tiến hành.

bạn có thể vui lòng giải thích cho tôi là những gì các lý do có thể cho errno OS 115

: Linux

đang conenct TCP của tôi là như sau

tcp_connect(......) 
{ 

    int iValOpt = 0; 
    int iLength= 0; 

    fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK); 

    ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen); 

    if (ret < 0) 
    { 

     if (errno == EINPROGRESS) 
     { 
       stTv.tv_sec = 60; 
       stTv.tv_usec = 0; 
       FD_ZERO(&write_fd); 
       FD_SET(sockID,&write_fd); 

       iLength = sizeof(int); 

       if (0 < select (sockID+1) , NULL,&write_fd,NULL,&stTv); 

       { 
         if(0 > getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength)) 
         { 
           return -1 
         } 

         if (0 != iValOpt) 
         { 
           return -1; 
         } 


         return success; 
       } 

       else 
       { 
         return -1; 
       } 

     } 
     else 
     { 
       return -1; 
     } 
    } 

    return success; 

} 
+0

gì xảy ra nếu bạn cố gắng để telnet đến ip 54.x.x.x mà không sử dụng ứng dụng của bạn? Hành vi tương tự? –

+0

không, công việc ứng dụng putty thủ công tốt – user1340512

+1

'Không chặn với thời gian chờ' là một mâu thuẫn về mặt. – EJP

Trả lời

4

này có vẻ là hành vi của connect() :

Nếu không thể thiết lập kết nối ngay lập tức và O_NO NBLOCK là đặt cho bộ mô tả tập tin cho socket, connect() sẽ thất bại và đặt errno thành [EINPROGRESS], nhưng yêu cầu kết nối không được bị hủy và kết nối phải được thiết lập không đồng bộ. Các cuộc gọi tiếp theo để kết nối() cho cùng một socket, trước khi kết nối được thiết lập, sẽ không thành công và đặt errno thành [EALREADY].

+0

Ứng dụng của tôi là SFTP, người dùng tạo nhiều kết nối với cùng một máy chủ với cùng một cổng 22 – user1340512

14

Dựa trên thông tin của bạn:

  • Bạn đang cố gắng để làm một connect()-54.x.x.x
  • Các ổ cắm là non-blocking
  • thời gian chờ kết nối là 60 sec

Thứ nhất, nếu bạn nhìn vào số /usr/include/asm-generic/errno.h bạn sẽ thấy như sau:

#define EINPROGRESS  115  /* Operation now in progress */ 

Điều đó có nghĩa là hoạt động hiện tại trên ổ cắm đang được tiến hành. Kể từ đó, anh nói anh đang làm một cuộc gọi connect(), cho phép làm một man connect:

 
EINPROGRESS 

The socket is nonblocking and the connection cannot be completed 
immediately. It is possible to select(2) or poll(2) for completion by 
selecting the socket for writing. After select(2) indicates 
writability, use getsockopt(2) to read the SO_ERROR option at level 
SOL_SOCKET to determine whether connect() completed successfully 
(SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual 
error codes listed here, explaining the reason for the failure). 

Vì vậy, đoán tốt nhất sẽ là TCP 3-way handshake (connect() cuộc gọi đến 54.x.x.x địa chỉ IP của bạn) đang mất nhiều thời gian hơn dự kiến ​​sẽ hoàn thành. Kể từ khi hoạt động connect() đang diễn ra, mọi thao tác tiếp theo trên socket sẽ dẫn đến mã lỗi EINPROGRESS. Như được đề xuất trong trang người đàn ông, hãy thử sử dụng select() hoặc poll() để kiểm tra xem ổ cắm của bạn đã sẵn sàng để sử dụng chưa (thực hiện các cuộc gọi read() hoặc write()).

Bạn có thể xác định điều gì đang ngăn việc bắt tay TCP của bạn hoàn tất bằng cách chụp và phân tích lưu lượng truy cập đến/từ máy của riêng bạn và 54.x.x.x. Công cụ tốt nhất để giúp bạn với điều này được gọi là WireShark. Chúc may mắn.

TCP 3 way handshake

+0

Tôi đã thêm Mã của mình ở trên, bạn có thể kiểm tra xem có bất kỳ lỗi nào không? mã trên hoạt động tốt trong netwrok của tôi, có thể do lỗi mạng không chặn EINPROGRESS của tôi không bao giờ xảy ra – user1340512

+0

@ user1340512: Hãy thử đăng phiên bản mã sạch và hoàn chỉnh để có thể kiểm tra. – gsbabil

+0

Cảm ơn bạn đã trả lời u r, tôi không thể đăng tất cả các mã ở đây, nhưng tôi đã dán mã lỗi mà thôi. Mã hoạt động tốt trong mạng của chúng tôi (có thể là do lỗi mạng không chặn của chúng tôi không bao giờ xảy ra và conenct luôn thành công). Tôi cần phải biết là nếu EINPROGRESS errno đặt là trên mã làm việc tốt hoặc trước khi 60 s abvoe mã có thể trở lại -1 – user1340512