kirim fungsi (winsock2.h)
Fungsi kirim mengirim data pada soket yang terhubung.
Sintaks
int WSAAPI send(
[in] SOCKET s,
[in] const char *buf,
[in] int len,
[in] int flags
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket yang terhubung.
[in] buf
Penunjuk ke buffer yang berisi data yang akan dikirimkan.
[in] len
Panjang, dalam byte, dari data dalam buffer yang diacu oleh parameter buf .
[in] flags
Sekumpulan bendera yang menentukan cara panggilan dilakukan. Parameter ini dibangun dengan menggunakan operator bitwise OR dengan salah satu nilai berikut.
Mengembalikan nilai
Jika tidak ada kesalahan yang terjadi, kirim mengembalikan jumlah total byte yang dikirim, yang dapat kurang dari angka yang diminta untuk dikirim dalam parameter lensa . 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. | |
Alamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan. Panggil setsockopt dengan opsi soket SO_BROADCAST untuk mengaktifkan penggunaan alamat siaran. | |
Panggilan Windows Sockets 1.1 yang diblokir dibatalkan melalui WSACancelBlockingCall. | |
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Parameter buf tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid. | |
Koneksi telah terputus karena aktivitas tetap aktif mendeteksi kegagalan saat operasi sedang berlangsung. | |
Tidak ada ruang buffer yang tersedia. | |
Soket tidak tersambung. | |
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 arah dan hanya mendukung operasi penerimaan. | |
Soket telah dimatikan; tidak dimungkinkan untuk mengirim soket setelah pematian dipanggil dengan cara mengatur ke SD_SEND atau SD_BOTH. | |
Soket ditandai sebagai nonblocking dan operasi yang diminta akan memblokir. | |
Soket berorientasi pada pesan, dan pesan lebih besar dari maksimum yang didukung oleh transportasi yang mendasar. | |
Host jarak jauh tidak dapat dicapai dari host ini saat ini. | |
Soket belum terikat dengan ikatan, atau bendera yang tidak diketahui ditentukan, atau MSG_OOB ditentukan untuk soket dengan SO_OOBINLINE diaktifkan. | |
Sirkuit virtual dihentikan karena waktu habis atau kegagalan lainnya. Aplikasi harus menutup soket karena tidak lagi dapat digunakan. | |
Sirkuit virtual direset oleh sisi jarak jauh yang mengeksekusi penutupan yang keras atau abortif. Untuk soket UDP, host jarak jauh tidak dapat mengirimkan datagram UDP yang dikirim sebelumnya dan merespons dengan paket ICMP "Port Unreachable". Aplikasi harus menutup soket karena tidak lagi dapat digunakan. | |
Koneksi telah terputus, karena kegagalan jaringan atau karena sistem di ujung lain tidak berfungsi tanpa pemberitahuan. |
Keterangan
Fungsi kirim digunakan untuk menulis data keluar pada soket yang terhubung.
Untuk soket berorientasi pesan (keluarga alamat AF_INET atau AF_INET6, jenis SOCK_DGRAM, dan protokol IPPROTO_UDP, misalnya), perawatan harus dilakukan agar tidak melebihi ukuran paket maksimum penyedia yang mendasar. Ukuran paket pesan maksimum untuk penyedia dapat diperoleh dengan memanggil getsockopt dengan parameter optname diatur ke SO_MAX_MSG_SIZE untuk mengambil nilai opsi soket. Jika data terlalu panjang untuk diteruskan secara atomik melalui protokol yang mendasar, kesalahan WSAEMSGSIZE dikembalikan, dan tidak ada data yang dikirimkan.
Keberhasilan penyelesaian fungsi kirim tidak menunjukkan bahwa data berhasil dikirimkan dan diterima kepada penerima. Fungsi ini hanya menunjukkan bahwa data berhasil dikirim.
Jika tidak ada ruang buffer yang tersedia dalam sistem transportasi untuk menahan data yang akan ditransmisikan, kirim akan memblokir kecuali soket telah ditempatkan dalam mode nonblocking. Pada soket berorientasi aliran nonblokir, jumlah byte yang ditulis dapat antara 1 dan panjang yang diminta, tergantung pada ketersediaan buffer pada komputer klien dan server. Fungsi pilih, WSAAsyncSelect atau WSAEventSelect dapat digunakan untuk menentukan kapan mungkin untuk mengirim lebih banyak data.
Panggilan kirim dengan parameter lensa nol diizinkan dan akan diperlakukan oleh implementasi sebagai berhasil. Dalam kasus seperti itu, kirim akan mengembalikan nol sebagai nilai yang valid. Untuk soket berorientasi pesan, datagram transportasi panjang nol dikirim.
Parameter bendera dapat digunakan untuk memengaruhi perilaku fungsi di luar opsi yang ditentukan untuk soket terkait. Semantik fungsi kirim ditentukan oleh opsi apa pun yang sebelumnya diatur pada soket yang ditentukan dalam parameter s dan parameter bendera yang diteruskan ke fungsi kirim .
Urutan panggilan yang dilakukan untuk mengirim juga merupakan urutan di mana buffer ditransmisikan ke lapisan transportasi. kirim tidak boleh dipanggil pada soket berorientasi aliran yang sama secara bersamaan dari utas yang berbeda, karena beberapa penyedia Winsock dapat membagi permintaan pengiriman besar menjadi beberapa transmisi, dan ini dapat menyebabkan data yang tidak diinginkan diselingi dari beberapa permintaan pengiriman bersamaan pada soket berorientasi aliran yang sama.
Contoh Kode
Contoh berikut menunjukkan penggunaan fungsi kirim .#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")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 27015
int main() {
//----------------------
// Declare and initialize variables.
int iResult;
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct sockaddr_in clientService;
int recvbuflen = DEFAULT_BUFLEN;
char *sendbuf = "Client: sending data test";
char recvbuf[DEFAULT_BUFLEN] = "";
//----------------------
// 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 SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == 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 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( DEFAULT_PORT );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if (iResult == SOCKET_ERROR) {
wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
//----------------------
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
wprintf(L"send failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %d\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
wprintf(L"shutdown failed with error: %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 )
wprintf(L"Bytes received: %d\n", iResult);
else if ( iResult == 0 )
wprintf(L"Connection closed\n");
else
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
} while( iResult > 0 );
// close the socket
iResult = closesocket(ConnectSocket);
if (iResult == SOCKET_ERROR) {
wprintf(L"close failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
WSACleanup();
return 0;
}
Contoh Kode
Untuk contoh lain yang menggunakan fungsi kirim , lihat Memulai Winsock.Catatan untuk Soket IrDA
- File header Af_irda.h harus disertakan secara eksplisit.
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 |