fungsi recv (winsock.h)
Fungsi recv menerima data dari soket yang terhubung atau soket tanpa koneksi terikat.
Sintaks
int recv(
[in] SOCKET s,
[out] char *buf,
[in] int len,
[in] int flags
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket yang terhubung.
[out] buf
Penunjuk ke buffer untuk menerima data masuk.
[in] len
Panjangnya, dalam byte, dari buffer yang diacu oleh parameter buf .
[in] flags
Sekumpulan bendera yang memengaruhi perilaku fungsi ini. Lihat keterangan di bawah ini. Lihat bagian Keterangan untuk detail tentang nilai yang mungkin untuk parameter ini.
Menampilkan nilai
Jika tidak ada kesalahan yang terjadi, recv mengembalikan jumlah byte yang diterima dan buffer yang diacu oleh parameter buf akan berisi data ini 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. | |
Parameter buf tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid. | |
Soket tidak tersambung. | |
Panggilan (pemblokiran) dibatalkan melalui WSACancelBlockingCall. | |
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Untuk soket berorientasi koneksi, kesalahan ini menunjukkan bahwa koneksi telah rusak karena aktivitas tetap aktif yang mendeteksi kegagalan saat operasi sedang berlangsung. Untuk soket datagram, kesalahan ini menunjukkan bahwa waktu hidup telah kedaluwarsa. | |
Deskriptor 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 menerima pada soket setelah pematian dipanggil dengan cara diatur ke SD_RECEIVE atau SD_BOTH. | |
Soket ditandai sebagai nonblocking dan operasi terima akan diblokir. | |
Pesan terlalu besar agar pas dengan buffer yang ditentukan dan terpotong. | |
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 aliran byte) adalah nol atau negatif. | |
Sirkuit virtual dihentikan karena waktu habis atau kegagalan lainnya. Aplikasi harus menutup soket karena tidak lagi dapat digunakan. | |
Koneksi terputus karena kegagalan jaringan atau karena sistem serekan gagal merespons. | |
Sirkuit virtual diatur ulang oleh sisi jarak jauh yang mengeksekusi penutupan yang keras atau abortif. Aplikasi harus menutup soket karena tidak lagi dapat digunakan. Pada soket UDP-datagram, kesalahan ini akan menunjukkan bahwa operasi pengiriman sebelumnya menghasilkan pesan "Port Unreachable" ICMP. |
Keterangan
Fungsi recv digunakan untuk membaca data masuk pada soket berorientasi koneksi, atau soket tanpa koneksi. Saat menggunakan protokol berorientasi koneksi, soket harus tersambung sebelum memanggil recv. Saat menggunakan protokol tanpa koneksi, soket harus terikat sebelum memanggil recv.
Alamat lokal soket harus diketahui. Untuk aplikasi server, gunakan fungsi ikatan eksplisit atau fungsi penerimaan implisit atau WSAAccept . Pengikatan eksplisit tidak disarankan untuk aplikasi klien. Untuk aplikasi klien, soket dapat terikat secara implisit ke alamat lokal menggunakan connect, WSAConnect, sendto, WSASendTo, atau WSAJoinLeaf.
Untuk soket yang tersambung atau tanpa koneksi, fungsi recv membatasi alamat tempat pesan yang diterima diterima. Fungsi ini hanya mengembalikan pesan dari alamat jarak jauh yang ditentukan dalam koneksi. Pesan dari alamat lain (diam-diam) dibuang.
Untuk soket berorientasi koneksi (jenis SOCK_STREAM misalnya), memanggil recv akan mengembalikan data sebanyak yang saat ini tersedia—hingga ukuran buffer yang ditentukan. Jika soket telah dikonfigurasi untuk penerimaan data OOB sebaris (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.
Untuk soket tanpa koneksi (ketik SOCK_DGRAM atau soket berorientasi pesan lainnya), data diekstrak dari datagram antrean pertama (pesan) dari alamat tujuan yang ditentukan oleh fungsi sambungkan .
Jika datagram atau pesan lebih besar dari buffer yang ditentukan, buffer diisi dengan bagian pertama datagram, dan recv menghasilkan kesalahan WSAEMSGSIZE. Untuk protokol yang tidak dapat diandalkan (misalnya, UDP) data berlebih hilang; untuk protokol yang dapat diandalkan, data disimpan oleh penyedia layanan sampai berhasil dibaca dengan memanggil recv dengan buffer yang cukup besar.
Jika tidak ada data masuk yang tersedia di soket, panggilan recv memblokir dan menunggu data tiba sesuai dengan aturan pemblokiran yang ditentukan untuk WSARecv dengan bendera MSG_PARTIAL tidak diatur kecuali soket tidak memblokir. Dalam hal ini, nilai SOCKET_ERROR dikembalikan dengan kode kesalahan yang diatur ke WSAEWOULDBLOCK. Fungsi 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 lancar, dan semua data telah diterima, recv akan segera selesai dengan nol byte yang diterima. Jika koneksi telah direset, recv 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 . Nilai parameter bendera yang mungkin dibangun dengan menggunakan operator OR bitwise 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). |
MSG_WAITALL | Permintaan penerimaan hanya akan selesai ketika salah satu peristiwa berikut terjadi:
|
Contoh Kode
Contoh kode berikut menunjukkan penggunaan fungsi recv .#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")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
int __cdecl main() {
//----------------------
// Declare and initialize variables.
WSADATA wsaData;
int iResult;
SOCKET ConnectSocket = INVALID_SOCKET;
struct sockaddr_in clientService;
char *sendbuf = "this is a test";
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if ( iResult == SOCKET_ERROR) {
closesocket (ConnectSocket);
printf("Unable to connect to server: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %ld\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while( iResult > 0 );
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
Contoh Kode
Untuk informasi selengkapnya, dan contoh lain dari fungsi recv , lihat Memulai Winsock.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
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 |