WinSock Recvfrom() bây giờ trở về WSAECONNRESET thay vì của chặn hoặc thời gian

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:263823
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TRIỆU CHỨNG
Trong Windows 2000, một chương trình người sử dụng giao thức Datagram (UDP) có thể không làm việc và có thể tạo ra một phản ứng WSAECONNRESET.
NGUYÊN NHÂN
Nếu gửi một datagram bằng cách sử dụng các SendTo chức năng kết quả trong một phản ứng "ICMP cổng không thể kết nối" và các chọn chức năng được thiết lập cho readfds, chương trình trả về 1 và các tiếp theo cuộc gọi đến các recvfrom chức năng không làm việc với một lỗi WSAECONNRESET (10054) phản ứng. Trong Microsoft Windows NT 4.0, tình trạng này gây ra các chọn chức năng để chặn hoặc thời gian ra.
GIẢI PHÁP
Để giải quyết vấn đề này, có được gói dịch vụ mới nhất cho Windows 2000. Để biết thêm thông tin, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức Microsoft:
260910 Cách lấy gói dịch vụ Windows XP mới nhất
Một ổ cắm mới IOCTL được gọi là "sio_udp_connreset" có được giới thiệu trong Windows 2000. Khi IOCTL này được sử dụng, chương trình phải viết lại đặc biệt cho Windows 2000 có được Windows NT 4.0 gốc hành vi. Windows NT 4.0, Microsoft Windows 95, và Microsoft Windows 98 có không hỗ trợ này IOCTL mới. Ngoài để viết lại đơn của bạn, bạn sẽ cần hotfix tham chiếu tiếp tục xuống trong bài viết này.

Các đoạn mã sau đây chứng tỏ một kỹ thuật có thể được sử dụng để gọi WSAIoctl với SIO_UDP_CONNRESET mã điều khiển để có được các cửa sổ gốc Hành vi của NT 4.0.
DWORDdwBytesReturned = 0;BOOLbNewBehavior = FALSE;DWORDstatus;// disable  new behavior using// IOCTL: SIO_UDP_CONNRESETstatus = WSAIoctl(sd, SIO_UDP_CONNRESET,&bNewBehavior, sizeof(bNewBehavior),                   NULL, 0, &dwBytesReturned,                   NULL, NULL);if (SOCKET_ERROR == status){DWORD dwErr = WSAGetLastError();if (WSAEWOULDBLOCK == dwErr){// nothing to doreturn(FALSE);}else{printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr);return(FALSE);}}				
Để có thể biên dịch mã này, bạn cần hoặc có mới nhất Mswsock.h bao gồm định nghĩa của SIO_UDP_CONNRESET hoặc để chèn dưới đây định nghĩa của nó trực tiếp vào mã của bạn.
// MS Transport Provider IOCTL to control// reporting PORT_UNREACHABLE messages// on UDP sockets via recv/WSARecv/etc.// Path TRUE in input buffer to enable (default if supported),// FALSE to disable.#defineSIO_UDP_CONNRESET_WSAIOW(IOC_VENDOR,12)				
Chú ý Hotfix được mô tả trong bài viết này sẽ giải quyết vấn đề trừ khi chương trình được viết lại để sử dụng SIO_UDP_CONNRESET mới IOCTL.

Để biên dịch mã này, nó là cần thiết để có các mới nhất nền tảng SDK được cài đặt trên máy tính của bạn. Điều này có sẵn từ các MSDN Web site sau:
TÌNH TRẠNG
Microsoft đã xác nhận rằng đây là một vấn đề trong các sản phẩm của Microsoft được liệt kê đầu bài viết này. Vấn đề này đã được sửa chữa đầu tiên trong Windows 2000 Service Gói 2.
THÔNG TIN THÊM
Để biết thêm thông tin về làm thế nào để cài đặt Windows 2000 và Windows 2000 hotfixes cùng lúc đó, nhấp vào số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
249149Cài đặt Microsoft Windows 2000 và Windows 2000 hotfixes

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 263823 - Xem lại Lần cuối: 12/05/2015 20:25:21 - Bản sửa đổi: 2.0

Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional Edition

  • kbnosurvey kbarchive kbhotfixserver kbqfe kbbug kbfix kbwin2000presp2fix kbmt KB263823 KbMtvi
Phản hồi