Tôi đang viết một máy chủ tcp trong Windows NT bằng cách sử dụng các cổng hoàn thành để khai thác I/O không đồng bộ. Tôi có một lớp TcpSocket, một lớp TcpServer và một số hàm gọi lại (ảo) để gọi khi một hoạt động I/O được hoàn thành, ví dụ: onRead() cho khi đọc xong. Tôi cũng onOpen() cho khi kết nối được thiết lập và onEof() cho khi kết nối được đóng lại, và như vậy. Tôi luôn đọc đọc cho socket, vì vậy nếu socket có hiệu quả dữ liệu (đọc sẽ được hoàn thành với kích thước> 0) nó gọi onRead(), thay vào đó nếu client đóng socket từ phía máy khách (đọc sẽ được hoàn thành với kích thước == 0) nó gọi onEof(), và máy chủ nhận thức được khi khách hàng đóng socket bằng closesocket (server_socket); từ phía của nó.lỗi "ERROR_NETNAME_DELETED" khét tiếng có được coi là lỗi không?
Tất cả các công trình một cách duyên dáng, nhưng tôi đã nhận thấy một điều:
khi tôi gọi closesocket (client_socket); trên điểm cuối bên của máy chủ của kết nối, thay vì phía máy khách, (với thiết lập nán {true, 0} hoặc không), đọc đang chờ xử lý sẽ được hoàn thành là sai, nghĩa là kích thước đọc sẽ không chỉ = = 0, nhưng cũng GetLastError() trả về lỗi: 64 hoặc 'ERROR_NETNAME_DELETED'. Tôi đã tìm kiếm nhiều về điều này trên web, nhưng không tìm thấy gì thú vị.
Sau đó tôi tự hỏi: nhưng đây có phải là lỗi thực sự không? Ý tôi là, điều này có thực sự được coi là lỗi không?
Vấn đề ở phía máy chủ, hàm gọi lại onError() sẽ được gọi khi tôi đóng sổ (client_socket); thay vì onEof(). Vì vậy, tôi nghĩ rằng điều này:
Điều gì xảy ra nếu tôi, khi nhận được lỗi 'ERROR_NETNAME_DELETED' "này, hãy gọi onEof() thay vì onError()? Điều đó sẽ giới thiệu một số lỗi hoặc hành vi không xác định? Một điểm quan trọng mà làm cho tôi hỏi câu hỏi này là:
Khi tôi đã nhận được này đọc xong với 'ERROR_NETNAME_DELETED', tôi đã kiểm tra chồng chéo cấu trúc, đặc biệt là overlapped-> tham số nội bộ có chứa lỗi NTSTATUS mã số của trình điều khiển cơ bản. Nếu chúng tôi thấy danh sách các mã lỗi NTSTATUS [http://www.tenox.tc/links/ntstatus.html] , chúng tôi có thể thấy rõ rằng 'ERROR_NETNAME_DELETED' được tạo bởi NTSTATUS 0xC000013B, đây là lỗi, nhưng được gọi là 'STATUS_LOCAL_DISCONNECT'. Vâng, nó không giống như một tên cho một lỗi. Nó có vẻ giống như `ERROR_IO_PENDING 'mà là một lỗi, nhưng cũng là một trạng thái cho một hành vi chính xác.
Vì vậy, điều gì về việc kiểm tra tham số bên trong của cấu trúc OVERLAPPED, và khi nào đây là == đến 'STATUS_LOCAL_DISCONNECT' một cuộc gọi đến hàm gọi lại onEof() được thực hiện? Điều gì sẽ rối tung lên?
Ngoài ra, tôi phải nói rằng từ phía máy chủ, nếu tôi gọi DisconnectEx() trước khi gọi closesocket (client_socket); Tôi sẽ không nhận được lỗi đó. Nhưng những gì về tôi không muốn gọi DisconnectEx()? Ví dụ. khi máy chủ tắt và không muốn đợi tất cả các kết thúc DisconnectEx(), nhưng chỉ muốn đóng tất cả kết nối của máy khách.
@Hans, tôi nghĩ anh ấy đã làm rất tốt khi mô tả cách anh ấy gặp phải lỗi đó. –