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 |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
Subsistem jaringan gagal. | |
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. | |
Panggilan (pemblokiran) dibatalkan melalui WSACancelBlockingCall. | |
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
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. | |
Soket tersambung. Fungsi ini tidak diizinkan dengan soket yang terhubung, baik soket berorientasi pada koneksi atau tanpa koneksi. | |
Untuk soket datagram, kesalahan ini menunjukkan bahwa waktu hidup telah kedaluwarsa. | |
Deskriptor dalam parameter s bukan soket. | |
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. | |
Soket telah dimatikan; tidak dimungkinkan untuk melakukan revvfrom pada soket setelah dipanggil dengan cara diatur ke SD_RECEIVE atau SD_BOTH. | |
Soket ditandai sebagai nonblocking dan operasi recvfrom akan memblokir. | |
Pesan terlalu besar untuk dimasukkan ke dalam buffer yang ditunjukkan oleh parameter buf dan terpotok. | |
Koneksi telah terputus, karena kegagalan jaringan atau karena sistem di ujung lain tidak berfungsi tanpa pemberitahuan. | |
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). |
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 |