إرجاع WinSock Recvfrom() الآن وسايكونريسيت بدلاً من حظر أو انقضاء المهلة

الأعراض

في Windows 2000، قد لا يعمل برنامج بروتوكول مخطط بيانات مستخدم (UDP) وقد تؤدي استجابة وسايكونريسيت.

السبب

إذا تم تعيين إرسال كتلة بيانات استخدام نتائج الدالة sendto في استجابة "منفذ ICMP غير قابلة للوصول" و حدد الدالة ريدفدس، يقوم البرنامج بإرجاع 1 واستدعاء الدالة recvfrom اللاحقة لا يعمل مع استجابة خطأ (10054) وسايكونريسيت. في Microsoft Windows NT 4.0، يؤدي هذا الموقف حدد دالة كتلة أو مهلة.

الحل

لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة لنظام التشغيل Windows 2000. لمزيد من المعلومات، انقر فوق رقم المقالة التالية لعرضها في "قاعدة معارف Microsoft":
260910 كيفية الحصول على أحدث حزمة خدمة Windows 2000
تم تقديم مأخذ توصيل IOCTL تسمى "SIO_UDP_CONNRESET" في Windows 2000. عند استخدام IOCTL هذا، يجب إعادة كتابة البرنامج خصيصا لنظام التشغيل Windows 2000 للحصول على سلوك نظام التشغيل Windows NT 4.0 الأصلي. يكون Windows NT 4.0 ونظام التشغيل Microsoft Windows 95 أو Microsoft Windows 98 أي دعم ل IOCTL هذا جديد. وبالإضافة إلى إعادة كتابة التطبيق الخاص بك، سوف تحتاج الإصلاح الجديد المشار إليه باستمرار في هذه المقالة.

توضح التعليمات البرمجية المتكررة تقنية التي يمكن استخدامها لاستدعاء WSAIoctl مع رمز التحكم SIO_UDP_CONNRESET للحصول على سلوك نظام التشغيل Windows NT 4.0 الأصلي.
DWORDdwBytesReturned = 0;BOOLbNewBehavior = FALSE;
DWORDstatus;

// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = 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 do
return(FALSE);
}
else
{
printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr);
return(FALSE);
}
}

لتكون قادراً على ترجمة هذه التعليمة البرمجية، تحتاج ل Mswsock.h الأخيرة التي تتضمن تعريف SIO_UDP_CONNRESET أو لإدراج أدناه تعريف له مباشرة في التعليمات البرمجية الخاصة بك.
// 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)

ملاحظة: الإصلاح العاجل الموضح في هذه المقالة لن تحل المشكلة ما لم يتم إعادة كتابة البرنامج لاستخدام IOCTL SIO_UDP_CONNRESET جديد.

لترجمة هذه التعليمة البرمجية، من الضروري أن أحدث Platform SDK المثبتة على جهاز الكمبيوتر الخاص بك. يتوفر هذا من موقع Msdn التالي:

الحالة

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في بداية هذه المقالة.
تم تصحيح هذه المشكلة أولاً في Windows 2000 Service Pack 2.

مزيد من المعلومات

لمزيد من المعلومات حول كيفية تثبيت الإصلاحات الضرورية Windows 2000 و Windows 2000 في نفس الوقت، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

249149 تثبيت نظام التشغيل Microsoft Windows 2000 و Windows 2000 الإصلاحات العاجلة

خصائص

رقم الموضوع: 263823 - آخر مراجعة: 09‏/01‏/2017 - المراجعة: 1

تعليقات