recvfrom function (winsock.h)

Fungsi recvfrom menerima datagram dan menyimpan alamat sumber.

Sintaks

int recvfrom(
  [in]                SOCKET   s,
  [out]               char     *buf,
  [in]                int      len,
  [in]                int      flags,
  [out]               sockaddr *from,
  [in, out, optional] int      *fromlen
);

Parameter

[in] s

Deskriptor yang mengidentifikasi soket terikat.

[out] buf

Buffer untuk data masuk.

[in] len

Panjangnya, dalam byte, dari buffer yang diacu oleh parameter buf .

[in] flags

Sekumpulan opsi yang mengubah perilaku panggilan fungsi di luar opsi yang ditentukan untuk soket terkait. Lihat Keterangan di bawah ini untuk detail selengkapnya.

[out] from

Penunjuk opsional ke buffer dalam struktur sockaddr yang akan menyimpan alamat sumber saat kembali.

[in, out, optional] fromlen

Penunjuk opsional ke ukuran, dalam byte, dari buffer yang diacu oleh parameter dari .

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, recvfrom mengembalikan jumlah byte yang diterima. Jika koneksi telah ditutup dengan baik, nilai yang dikembalikan adalah nol. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEFAULT
Buffer yang diarahkan oleh parameter buf atau dari tidak berada di ruang alamat pengguna, atau parameter fromlen terlalu kecil untuk mengakomodasi alamat sumber alamat serekan.
WSAEINTR
Panggilan (pemblokiran) dibatalkan melalui WSACancelBlockingCall.
WSAEINPROGRESS
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEINVAL
Soket belum terikat dengan ikatan, atau bendera yang tidak diketahui ditentukan, atau MSG_OOB ditentukan untuk soket dengan SO_OOBINLINE diaktifkan, atau (hanya untuk soket gaya aliran byte ) adalah nol atau negatif.
WSAEISCONN
Soket tersambung. Fungsi ini tidak diizinkan dengan soket yang terhubung, baik soket berorientasi pada koneksi atau tanpa koneksi.
WSAENETRESET
Untuk soket datagram, kesalahan ini menunjukkan bahwa waktu hidup telah kedaluwarsa.
WSAENOTSOCK
Deskriptor dalam parameter s bukan soket.
WSAEOPNOTSUPP
MSG_OOB ditentukan, tetapi soket tidak bergaya aliran seperti jenis SOCK_STREAM, data OOB tidak didukung di domain komunikasi yang terkait dengan soket ini, atau soket tidak langsung dan hanya mendukung operasi pengiriman.
WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk melakukan revvfrom pada soket setelah dipanggil dengan cara diatur ke SD_RECEIVE atau SD_BOTH.
WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan operasi recvfrom akan memblokir.
WSAEMSGSIZE
Pesan terlalu besar untuk dimasukkan ke dalam buffer yang ditunjukkan oleh parameter buf dan terpotok.
WSAETIMEDOUT
Koneksi telah terputus, karena kegagalan jaringan atau karena sistem di ujung lain tidak berfungsi tanpa pemberitahuan.
WSAECONNRESET
Sirkuit virtual direset oleh sisi jarak jauh yang mengeksekusi penutupan yang keras atau abortif. Aplikasi harus menutup soket; itu tidak lagi dapat digunakan. Pada soket UDP-datagram, kesalahan ini menunjukkan operasi pengiriman sebelumnya menghasilkan pesan Port ICMP Tidak Dapat Dijangkau .

Keterangan

Fungsi recvfrom membaca data masuk pada soket yang terhubung dan tidak terhubung dan mengambil alamat tempat data dikirim. Fungsi ini biasanya digunakan dengan soket tanpa koneksi. Alamat lokal soket harus diketahui. Untuk aplikasi server, ini biasanya dilakukan secara eksplisit melalui ikatan. Pengikatan eksplisit tidak disarankan untuk aplikasi klien. Untuk aplikasi klien yang menggunakan fungsi ini, soket dapat terikat secara implisit ke alamat lokal melalui sendto, WSASendTo, atau WSAJoinLeaf.

Untuk soket berorientasi aliran seperti jenis SOCK_STREAM, panggilan ke recvfrom mengembalikan informasi sebanyak yang saat ini tersedia—hingga ukuran buffer yang ditentukan. Jika soket telah dikonfigurasi untuk penerimaan sebaris data OOB (opsi soket SO_OOBINLINE) dan data OOB belum dibaca, hanya data OOB yang akan dikembalikan. Aplikasi ini dapat menggunakan perintah ioctlsocket atau WSAIoctlSIOCATMARK untuk menentukan apakah ada lagi data OOB yang tetap harus dibaca. Parameter from dan fromlen diabaikan untuk soket berorientasi koneksi.

Untuk soket berorientasi pesan, data diekstrak dari pesan antrean pertama, hingga ukuran buffer yang ditentukan. Jika datagram atau pesan lebih besar dari buffer yang ditentukan, buffer diisi dengan bagian pertama datagram, dan revfrom menghasilkan kesalahan WSAEMSGSIZE. Untuk protokol yang tidak dapat diandalkan (misalnya, UDP) data berlebih hilang. Untuk UDP jika paket yang diterima tidak berisi data (kosong), nilai pengembalian dari fungsi recvfrom adalah nol.

Jika parameter from bukan nol dan soket tidak berorientasi pada koneksi, (ketik SOCK_DGRAM misalnya), alamat jaringan serekan yang mengirim data disalin ke struktur sockaddr yang sesuai. Nilai yang ditunjukkan oleh fromlen diinisialisasi ke ukuran struktur ini dan dimodifikasi, saat dikembalikan, untuk menunjukkan ukuran aktual alamat yang disimpan dalam struktur sockaddr .

Jika tidak ada data masuk yang tersedia di soket, fungsi recvfrom memblokir dan menunggu data tiba sesuai dengan aturan pemblokiran yang ditentukan untuk WSARecv dengan bendera MSG_PARTIAL tidak diatur kecuali soket tidak diblokir. Dalam hal ini, nilai SOCKET_ERROR dikembalikan dengan kode kesalahan yang diatur ke WSAEWOULDBLOCK. Pilih, WSAAsyncSelect, atau WSAEventSelect dapat digunakan untuk menentukan kapan lebih banyak data tiba.

Jika soket berorientasi pada koneksi dan sisi jarak jauh telah mematikan koneksi dengan baik, panggilan ke recvfrom akan segera selesai dengan nol byte yang diterima. Jika koneksi telah direset recvfrom akan gagal dengan kesalahan WSAECONNRESET.

Parameter bendera dapat digunakan untuk memengaruhi perilaku pemanggilan fungsi di luar opsi yang ditentukan untuk soket terkait. Semantik fungsi ini ditentukan oleh opsi soket dan parameter bendera . Yang terakhir dibangun dengan menggunakan operator bitwise OR dengan salah satu nilai berikut.

Nilai Makna
MSG_PEEK Mengintip data masuk. Data disalin ke dalam buffer tetapi tidak dihapus dari antrean input.
MSG_OOB Memproses data Out of Band (OOB).
 
Catatan Saat mengeluarkan panggilan Winsock pemblokiran seperti recvfrom, Winsock mungkin perlu menunggu peristiwa jaringan sebelum panggilan dapat 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 recvfrom .
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{

    int iResult = 0;

    WSADATA wsaData;

    SOCKET RecvSocket;
    struct sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    char RecvBuf[1024];
    int BufLen = 1024;

    struct sockaddr_in SenderAddr;
    int SenderAddrSize = sizeof (SenderAddr);

    //-----------------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error %d\n", iResult);
        return 1;
    }
    //-----------------------------------------------
    // Create a receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
    wprintf(L"Receiving datagrams...\n");
    iResult = recvfrom(RecvSocket,
                       RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
    }
 
    //-----------------------------------------------
    // Close the socket when finished receiving datagrams
    wprintf(L"Finished receiving. Closing socket.\n");
    iResult = closesocket(RecvSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
        return 1;
    }

    //-----------------------------------------------
    // Clean up and exit.
    wprintf(L"Exiting.\n");
    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 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 winsock.h (termasuk Winsock2.h)
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

WSAAsyncSelect

WSAEventPilih

Fungsi Winsock

Referensi Winsock

recv

Mengirim

sockaddr

soket