Fungsi WSAAccept (winsock2.h)
Fungsi WSAAccept secara kondisional menerima koneksi berdasarkan nilai pengembalian fungsi kondisi, memberikan kualitas spesifikasi alur layanan, dan memungkinkan transfer data koneksi.
Sintaksis
SOCKET WSAAPI WSAAccept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] LPINT addrlen,
[in] LPCONDITIONPROC lpfnCondition,
[in] DWORD_PTR dwCallbackData
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket yang mendengarkan koneksi setelah panggilan ke mendengarkan fungsi.
[out] addr
Penunjuk opsional ke struktur sockaddr
[in, out] addrlen
Penunjuk opsional ke bilangan bulat yang berisi panjang struktur sockaddr
[in] lpfnCondition
Alamat fungsi kondisi opsional yang ditentukan aplikasi yang akan membuat keputusan terima/tolak berdasarkan informasi pemanggil yang diteruskan sebagai parameter, dan secara opsional membuat atau bergabung dengan grup soket dengan menetapkan nilai yang sesuai ke parameter hasil g fungsi ini. Jika parameter ini NULL, maka tidak ada fungsi kondisi yang dipanggil.
[in] dwCallbackData
Data panggilan balik diteruskan kembali ke fungsi kondisi yang ditentukan aplikasi sebagai nilai parameter
Mengembalikan nilai
Jika tidak ada kesalahan yang terjadi, WSAAccept mengembalikan nilai jenis SOCKET yang merupakan deskriptor untuk soket yang diterima. Jika tidak, nilai INVALID_SOCKET dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.
Bilangan bulat yang dirujuk oleh addrlen
Kode kesalahan | Arti |
---|---|
|
Upaya dilakukan untuk mengakses soket dengan cara yang dilarang oleh izin aksesnya. Kesalahan ini dikembalikan jika permintaan koneksi yang ditawarkan telah kehabisan waktu atau telah ditarik. |
Tidak ada koneksi yang dapat dibuat karena komputer target secara aktif menolaknya. Kesalahan ini dikembalikan jika permintaan koneksi ditolak secara paksa seperti yang ditunjukkan dalam nilai pengembalian fungsi kondisi (CF_REJECT). | |
|
Koneksi yang ada ditutup secara paksa oleh host jarak jauh. Kesalahan ini dikembalikan dari koneksi masuk ditunjukkan, tetapi kemudian dihentikan oleh peer jarak jauh sebelum menerima panggilan. |
Sistem mendeteksi alamat penunjuk yang tidak valid dalam mencoba menggunakan argumen penunjuk dalam panggilan. Kesalahan ini dikembalikan dari parameter addrlen |
|
|
Operasi pemblokiran terganggu oleh panggilan ke WSACancelBlockingCall. Kesalahan ini dikembalikan jika panggilan Windows Sockets 1.1 pemblokiran dibatalkan melalui WSACancelBlockingCall. |
Operasi pemblokiran sedang dijalankan. Kesalahan ini dikembalikan jika pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung. | |
Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika mendengarkan tidak dipanggil sebelum WSAAccept, nilai pengembalian fungsi kondisi bukan yang valid, atau kasus apa pun di mana soket yang ditentukan berada dalam status tidak valid. | |
|
Terlalu banyak soket terbuka. Kesalahan ini dikembalikan jika antrean tidak ada saat masuk ke WSAAccept dan tidak ada deskriptor soket yang tersedia. |
|
Operasi soket menemukan jaringan mati. Kesalahan ini dikembalikan jika subsistem jaringan gagal. |
|
Operasi pada soket tidak dapat dilakukan karena sistem tidak memiliki ruang buffer yang cukup atau karena antrean penuh. Kesalahan ini dikembalikan jika tidak ada ruang buffer yang tersedia. |
|
Operasi dicoba pada sesuatu yang bukan soket. Kesalahan ini dikembalikan jika deskriptor soket yang diteruskan dalam parameter |
Keluarga protokol belum dikonfigurasi ke dalam sistem atau tidak ada implementasi untuk itu ada. Kesalahan ini dikembalikan jika soket yang direferensikan bukan jenis yang mendukung layanan berorientasi koneksi. | |
Operasi soket non-pemblokiran tidak dapat segera diselesaikan. Kesalahan ini dikembalikan jika soket ditandai sebagai tidak memblokir dan tidak ada koneksi yang akan diterima. | |
Aplikasi belum memanggil WSAStartup, atau WSAStartup gagal. Kesalahan ini dikembalikan dari panggilan yang berhasil ke WSAStartup dit fungsi tidak terjadi sebelum menggunakan fungsi ini. | |
Ini biasanya merupakan kesalahan sementara selama resolusi nama host dan berarti bahwa server lokal tidak menerima respons dari server otoritatif. Kesalahan ini dikembalikan jika penerimaan permintaan koneksi ditangguhkan seperti yang ditunjukkan dalam nilai pengembalian fungsi kondisi (CF_DEFER). |
Komentar
Fungsi WSAAccept
Soket dalam mode default (pemblokiran) akan memblokir hingga koneksi ada ketika aplikasi memanggil WSAAccept dan tidak ada koneksi yang tertunda pada antrean.
Soket dalam mode nonblocking (pemblokiran) gagal dengan kesalahan WSAEWOULDBLOCK ketika aplikasi memanggil WSAAccept dan tidak ada koneksi yang tertunda pada antrean. Setelah WSAAccept berhasil dan mengembalikan handel soket baru, soket yang diterima tidak dapat digunakan untuk menerima koneksi lagi. Soket asli tetap terbuka dan mendengarkan permintaan koneksi baru.
Parameter addr
Prototipe fungsi kondisi didefinisikan dalam file header Winsock2.h
sebagai LPCONDITIONPROC, sebagai berikut.
int CALLBACK
ConditionFunc(
IN LPWSABUF lpCallerId,
IN LPWSABUF lpCallerData,
IN OUT LPQOS lpSQOS,
IN OUT LPQOS lpGQOS,
IN LPWSABUF lpCalleeId,
IN LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD_PTR dwCallbackData
);
Parameter lpCallerId
Parameter
Parameter lpGQOS
lpCalleeData adalah parameter hasil yang digunakan oleh fungsi kondisi untuk menyediakan data pengguna kembali ke entitas penghubung. Len sa
Parameter g ditetapkan dalam fungsi kondisi untuk menunjukkan salah satu tindakan berikut:
- Jika
g adalah pengidentifikasi grup soket yang ada, tambahkanke grup ini, asalkan semua persyaratan yang ditetapkan oleh grup ini terpenuhi. - Jika
g = SG_UNCONSTRAINED_GROUP, buat grup soket yang tidak dibatasi dansebagai anggota pertama. - Jika
g = SG_CONSTRAINED_GROUP, buat grup soket yang dibatasi dansebagai anggota pertama. - Jika g = nol, tidak ada operasi grup yang dilakukan.
Nilai parameter dwCallbackData
Kode Contoh
Contoh berikut menunjukkan penggunaan fungsi#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
/* Define an example conditional function that depends on the pQos field */
int CALLBACK ConditionAcceptFunc(
LPWSABUF lpCallerId,
LPWSABUF lpCallerData,
LPQOS pQos,
LPQOS lpGQOS,
LPWSABUF lpCalleeId,
LPWSABUF lpCalleeData,
GROUP FAR * g,
DWORD_PTR dwCallbackData
)
{
if (pQos != NULL) {
RtlZeroMemory(pQos, sizeof(QOS));
return CF_ACCEPT;
} else
return CF_REJECT;
}
int main() {
/* Declare and initialize variables */
WSADATA wsaData;
SOCKET ListenSocket, AcceptSocket;
struct sockaddr_in saClient;
int iClientSize = sizeof(saClient);
u_short port = 27015;
char* ip;
sockaddr_in service;
int error;
/* Initialize Winsock */
error = WSAStartup(MAKEWORD(2,2), &wsaData);
if (error) {
printf("WSAStartup() failed with error: %d\n", error);
return 1;
}
/* Create a TCP listening socket */
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("socket() failed with error: %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
/*-----------------------------------------
* Set up the sock addr structure that the listening socket
* will be bound to. In this case, the structure holds the
* local IP address and the port specified. */
service.sin_family = AF_INET;
service.sin_port = htons(port);
hostent* thisHost;
thisHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);
service.sin_addr.s_addr = inet_addr(ip);
/*-----------------------------------------
* Bind the listening socket to the IP address.
* and port number specified by the sockaddr structure. */
error = bind(ListenSocket, (SOCKADDR *) &service, sizeof(SOCKADDR));
if (error == SOCKET_ERROR) {
printf("bind() failed with error: %d\n", WSAGetLastError() );
closesocket(ListenSocket);
WSACleanup();
return 1;
}
/* Make the socket listen for incoming connection requests */
error = listen(ListenSocket, 1);
if (error == SOCKET_ERROR) {
printf("listen() failed with error: %d\n", WSAGetLastError() );
closesocket(ListenSocket);
WSACleanup();
return 1;
}
printf("Listening...\n");
/*-----------------------------------------
* Accept an incoming connection request on the
* listening socket and transfer control to the
* accepting socket. */
AcceptSocket = WSAAccept(ListenSocket, (SOCKADDR*) &saClient, &iClientSize,
&ConditionAcceptFunc, NULL);
/* Now do some work with the AcceptSocket
* At this point, the application could
* handle data transfer on the socket, or other socket
* functionality.*/
/* Then clean up and quit */
closesocket(AcceptSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
Windows Phone 8: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.
windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store pada Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Persyaratan
Syarat | Nilai |
---|---|
klien minimum yang didukung | Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP] |
server minimum yang didukung |
Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Platform Target |
Windows |
Header |
winsock2.h |
Pustaka |
Ws2_32.lib |
DLL |
Ws2_32.dll |
Lihat juga
WSASocket
Referensi
ikatan
sockaddr
soket