Bagikan melalui


Kode Kesalahan - errno, h_errno dan WSAGetLastError

Dalam aplikasi Winsock, kode kesalahan diambil menggunakan fungsi WSAGetLastError , pengganti Soket Windows untuk fungsi Windows GetLastError . Kode kesalahan yang dikembalikan oleh Windows Sockets mirip dengan konstanta kode kesalahan soket UNIX, tetapi konstanta semuanya diawali dengan WSA. Jadi dalam aplikasi Winsock kode kesalahan WSAEWOULDBLOCK akan dikembalikan, sementara dalam aplikasi UNIX kode kesalahan EWOULDBLOCK akan dikembalikan.

Kode kesalahan yang ditetapkan oleh Windows Sockets tidak tersedia melalui variabel errno . Selain itu, untuk kelas fungsi getXbyY , kode kesalahan tidak tersedia melalui variabel h_errno . Fungsi WSAGetLastError dimaksudkan untuk menyediakan cara yang dapat diandalkan untuk utas dalam proses multithreaded untuk mendapatkan informasi kesalahan per utas.

Untuk kompatibilitas dengan Berkeley UNIX (BSD), versi awal Windows (Windows 95 dengan Windows Socket 2 Update dan Windows 98, misalnya) mendefinisikan ulang konstanta kesalahan Berkeley reguler biasanya ditemukan di errno.h pada BSD sebagai kesalahan Windows Sockets WSA yang setara. Jadi misalnya, ECONNREFUSED didefinisikan sebagai WSAECONNREFUSED dalam file header Winsock.h . Dalam versi Windows berikutnya (Windows NT 3.1 dan yang lebih baru) definisi ini dikomentari untuk menghindari konflik dengan errno.h yang digunakan dengan Microsoft C/C++ dan Visual Studio.

File header Winsock2.h yang disertakan dengan Microsoft Windows Software Development Kit (SDK), Platform Software Development Kit (SDK), dan Visual Studio masih berisi blok definisi yang dikomentari dalam blok #ifdef 0 dan #endif yang menentukan kode kesalahan soket BSD agar sama dengan konstanta kesalahan WSA. Ini dapat digunakan untuk memberikan beberapa kompatibilitas dengan pemrograman soket UNIX, BSD, dan Linux. Untuk kompatibilitas dengan BSD, aplikasi dapat memilih untuk mengubah Winsock2.h dan membatalkan komentar blok ini. Namun, pengembang aplikasi sangat tidak dianjurkan untuk membatalkan komentar blok ini karena konflik yang tidak dapat dihindari dengan errno.h di sebagian besar aplikasi. Selain itu, kesalahan soket BSD didefinisikan ke nilai yang sangat berbeda dari yang digunakan dalam program UNIX, BSD, dan Linux. Pengembang aplikasi sangat didorong untuk menggunakan konstanta kesalahan WSA dalam aplikasi soket.

Definisi ini tetap dikomentari di header Winsock2.h dalam blok #ifdef 0 dan #endif. Jika pengembang aplikasi bersikeras menggunakan kode kesalahan BSD untuk kompatibilitas, aplikasi dapat memilih untuk menyertakan baris formulir:

#include <windows.h>

#define errno WSAGetLastError()

Ini memungkinkan kode jaringan yang ditulis untuk menggunakan errno global untuk bekerja dengan benar di lingkungan satu utas. Ada beberapa kelemahan yang sangat serius. Jika file sumber menyertakan kode yang memeriksa errno untuk fungsi soket dan non-soket, mekanisme ini tidak dapat digunakan. Selain itu, tidak mungkin bagi aplikasi untuk menetapkan nilai baru ke errno. (Di Windows Sockets, fungsi WSASetLastError dapat digunakan untuk tujuan ini.)

Gaya BSD umum

r = recv(...);
if (r == -1
    && errno == EWOULDBLOCK)
    {...}

Gaya Pilihan

r = recv(...);
if (r == -1       /* (but see below) */
    && WSAGetLastError() == EWOULDBLOCK)
    {...}

Meskipun konstanta kesalahan konsisten dengan Berkeley Sockets 4.3 disediakan untuk tujuan kompatibilitas, aplikasi sangat dianjurkan untuk menggunakan definisi kode kesalahan WSA. Ini karena kode kesalahan yang dikembalikan oleh fungsi Windows Sockets tertentu termasuk dalam rentang standar kode kesalahan seperti yang didefinisikan oleh Microsoft C©. Dengan demikian, versi yang lebih baik dari fragmen kode sumber sebelumnya adalah:

r = recv(...);
if (r == -1       /* (but see below) */
    && WSAGetLastError() == WSAEWOULDBLOCK)
    {...}

Spesifikasi Winsock 1.1 asli yang ditentukan pada tahun 1995 merekomendasikan serangkaian kode kesalahan, dan mencantumkan kemungkinan kesalahan yang dapat dikembalikan sebagai akibat dari setiap fungsi. Windows Sockets 2 menambahkan fungsi dan fitur dengan kode kesalahan Windows Sockets lainnya yang dikembalikan selain yang tercantum dalam spesifikasi Winsock asli. Fungsi tambahan telah ditambahkan dari waktu ke waktu untuk meningkatkan Winsock untuk digunakan oleh pengembang. Misalnya, fungsi layanan nama baru (getaddrinfo dan getnameinfo, misalnya) ditambahkan yang mendukung IPv6 dan IPv4 pada Windows XP dan yang lebih baru. Beberapa fungsi layanan nama khusus IPv4 yang lebih lama (kelas fungsi getXbyY , misalnya) telah ditolak.

Daftar lengkap kemungkinan kode kesalahan yang dikembalikan oleh fungsi Windows Sockets diberikan di bagian pada Kode Kesalahan Soket Windows.

Menangani Kesalahan Winsock

Porting Aplikasi Soket ke Winsock

Kode Kesalahan Windows Sockets

Pertimbangan Pemrograman Winsock