fungsi accept (winsock2.h)

Fungsi terima mengizinkan upaya koneksi masuk pada soket.

Sintaks

SOCKET WSAAPI accept(
  [in]      SOCKET   s,
  [out]     sockaddr *addr,
  [in, out] int      *addrlen
);

Parameter

[in] s

Deskriptor yang mengidentifikasi soket yang telah ditempatkan dalam status mendengarkan dengan fungsi dengar . Koneksi sebenarnya dibuat dengan soket yang dikembalikan oleh terima.

[out] addr

Penunjuk opsional ke buffer yang menerima alamat entitas penghubung, seperti yang diketahui oleh lapisan komunikasi. Format parameter addr yang tepat ditentukan oleh keluarga alamat yang ditetapkan ketika soket dari struktur sockaddr dibuat.

[in, out] addrlen

Penunjuk opsional ke bilangan bulat yang berisi panjang struktur yang diarahkan oleh parameter addr .

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, terima mengembalikan nilai jenis SOCKET yang merupakan deskriptor untuk soket baru. Nilai yang dikembalikan ini adalah handel untuk soket tempat koneksi aktual dibuat.

Jika tidak, nilai INVALID_SOCKET dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Bilangan bulat yang disebut oleh addrlen awalnya berisi jumlah ruang yang diarahkan oleh addr. Saat dikembalikan, itu akan berisi panjang aktual dalam byte alamat yang dikembalikan.

Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAECONNRESET
Koneksi masuk ditunjukkan, tetapi kemudian dihentikan oleh peer jarak jauh sebelum menerima panggilan.
WSAEFAULT
Parameter addrlen terlalu kecil atau addr bukan bagian yang valid dari ruang alamat pengguna.
WSAEINTR
Panggilan Windows Sockets 1.1 yang diblokir dibatalkan melalui WSACancelBlockingCall.
WSAEINVAL
Fungsi dengar tidak dipanggil sebelum menerima.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEMFILE
Antrean tidak ada habisnya setelah entri untuk menerima dan tidak ada deskriptor yang tersedia.
WSAENETDOWN
Subsistem jaringan gagal.
WSAENOBUFS
Tidak ada ruang buffer yang tersedia.
WSAENOTSOCK
Deskriptor bukan soket.
WSAEOPNOTSUPP
Soket yang direferensikan bukan jenis yang mendukung layanan berorientasi koneksi.
WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan tidak ada koneksi yang akan diterima.

Keterangan

Fungsi terima mengekstrak koneksi pertama pada antrean koneksi yang tertunda pada soket. Kemudian membuat dan mengembalikan handel ke soket baru. Soket yang baru dibuat adalah soket yang akan menangani koneksi aktual; ini memiliki properti yang sama dengan soket , termasuk peristiwa asinkron yang terdaftar dengan fungsi WSAAsyncSelect atau WSAEventSelect .

Fungsi terima dapat memblokir pemanggil hingga koneksi ada jika tidak ada koneksi yang tertunda yang ada pada antrean, dan soket ditandai sebagai pemblokiran. Jika soket ditandai sebagai tidak memblokir dan tidak ada koneksi yang tertunda yang ada pada antrean, terima mengembalikan kesalahan seperti yang dijelaskan dalam hal berikut ini. Setelah berhasil menyelesaikan penerimaan mengembalikan handel soket baru, soket yang diterima tidak dapat digunakan untuk menerima lebih banyak koneksi. Soket asli tetap terbuka dan mendengarkan permintaan koneksi baru.

Addr parameter adalah parameter hasil yang diisi dengan alamat entitas penghubung, seperti yang diketahui oleh lapisan komunikasi. Format parameter addr yang tepat ditentukan oleh keluarga alamat tempat komunikasi terjadi. Addrlen adalah parameter hasil nilai; awalnya harus berisi jumlah ruang yang ditujukkan oleh addr; saat dikembalikan, alamat akan berisi panjang aktual (dalam byte) dari alamat yang dikembalikan.

Fungsi terima digunakan dengan jenis soket berorientasi koneksi seperti SOCK_STREAM. Jika addr dan/atau addrlen sama dengan NULL, maka tidak ada informasi tentang alamat jarak jauh soket yang diterima yang dikembalikan.

Catatan Saat mengeluarkan panggilan Winsock pemblokiran seperti terima, Winsock mungkin perlu menunggu acara jaringan sebelum panggilan selesai. Winsock melakukan penantian yang dapat diperingatkan dalam situasi ini, yang dapat terganggu oleh panggilan prosedur asinkron (APC) yang dijadwalkan pada utas yang sama. Mengeluarkan panggilan Winsock pemblokiran lain di dalam APC yang mengganggu panggilan Winsock pemblokiran yang sedang berlangsung pada utas yang sama akan menyebabkan perilaku yang tidak terdefinisi, dan tidak boleh dicoba oleh klien Winsock.
 

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi terima .
#ifndef UNICODE
#define UNICODE
#endif

#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <windows.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int wmain(void)
{

    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_port = htons(27015);
    inet_pton(AF_INET, "127.0.0.1", &service.sin_addr);

    if (bind(ListenSocket,
             (SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");

    //----------------------
    // Accept the connection.
    AcceptSocket = accept(ListenSocket, NULL, NULL);
    if (AcceptSocket == INVALID_SOCKET) {
        wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    } else
        wprintf(L"Client connected.\n");

    // No longer need server socket
    closesocket(ListenSocket);

    WSACleanup();
    return 0;
}


Untuk contoh lain yang menggunakan fungsi terima , lihat Memulai Winsock.

Catatan untuk ATM

Berikut ini adalah masalah penting yang terkait dengan penyiapan koneksi, dan harus dipertimbangkan saat menggunakan Mode Transfer Asinkron (ATM) dengan Windows Sockets 2:

  • Fungsi accept dan WSAAccept tidak selalu mengatur parameter alamat jarak jauh dan panjang alamat. Oleh karena itu, saat menggunakan ATM, pemanggil harus menggunakan fungsi WSAAccept dan menempatkan ATM_CALLING_PARTY_NUMBER_IE di anggota ProviderSpecific dari struktur QoS , yang sendiri termasuk dalam parameter lpSQOS dari fungsi panggilan balik yang digunakan sesuai dengan WSAAccept.
  • Saat menggunakan fungsi terima , sadari bahwa fungsi dapat kembali sebelum pembentukan koneksi telah melintasi seluruh jarak antara pengirim dan penerima. Ini karena fungsi terima kembali segera setelah menerima pesan CONNECT ACK; di ATM, pesan CONNECT ACK dikembalikan oleh sakelar berikutnya di jalur segera setelah pesan CONNECT diproses (bukan CONNECT ACK yang dikirim oleh node akhir tempat koneksi akhirnya dibuat). Dengan demikian, aplikasi harus menyadari bahwa jika data dikirim segera setelah penerimaan pesan CONNECT ACK, kehilangan data dimungkinkan, karena koneksi mungkin belum dibuat sepanjang jalan antara pengirim dan penerima.

Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.

Persyaratan

Persyaratan 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]
Target Platform Windows
Header winsock2.h
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

WSAAccept

WSAAsyncSelect

Fungsi Winsock

Referensi Winsock

Mengikat

sambungkan

Mendengarkan

pilih

sockaddr

soket