Bagikan melalui


fungsi sendto (winsock.h)

Fungsi sendto mengirim data ke tujuan tertentu.

Sintaks

int sendto(
  [in] SOCKET         s,
  [in] const char     *buf,
  [in] int            len,
  [in] int            flags,
  [in] const sockaddr *to,
  [in] int            tolen
);

Parameter

[in] s

Deskriptor yang mengidentifikasi soket (mungkin terhubung).

[in] buf

Penunjuk ke buffer yang berisi data yang akan dikirimkan.

[in] len

Panjang, dalam byte, dari data yang diacak oleh parameter buf .

[in] flags

Sekumpulan bendera yang menentukan cara panggilan dilakukan.

[in] to

Penunjuk opsional ke struktur sockaddr yang berisi alamat soket target.

[in] tolen

Ukuran, dalam byte, dari alamat yang ditujukan oleh parameter ke .

Menampilkan nilai

Jika tidak ada kesalahan yang terjadi, sendto mengembalikan jumlah total byte yang dikirim, yang bisa kurang dari angka yang ditunjukkan oleh len. 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.
WSAEACCES
Alamat yang diminta adalah alamat siaran, tetapi bendera yang sesuai tidak ditetapkan. Panggil setsockopt dengan parameter SO_BROADCAST untuk memungkinkan penggunaan alamat siaran.
WSAEINVAL
Bendera yang tidak diketahui ditentukan, atau MSG_OOB ditentukan untuk soket dengan SO_OOBINLINE diaktifkan.
WSAEINTR
Panggilan Windows Sockets 1.1 yang diblokir dibatalkan melalui WSACancelBlockingCall.
WSAEINPROGRESS
Panggilan Windows Sockets 1.1 yang diblokir sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEFAULT
Parameter buf atau ke bukan bagian dari ruang alamat pengguna, atau parameter tolen terlalu kecil.
WSAENETRESET
Koneksi telah terputus karena aktivitas tetap aktif mendeteksi kegagalan saat operasi sedang berlangsung.
WSAENOBUFS
Tidak ada ruang buffer yang tersedia.
WSAENOTCONN
Soket tidak tersambung (hanya soket berorientasi koneksi).
WSAENOTSOCK
Deskriptor 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 arah dan hanya mendukung operasi penerimaan.
WSAESHUTDOWN
Soket telah dimatikan; tidak dimungkinkan untuk mengirim ke soket setelah pematian dipanggil dengan cara mengatur ke SD_SEND atau SD_BOTH.
WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan operasi yang diminta akan memblokir.
WSAEMSGSIZE
Soket berorientasi pada pesan, dan pesan lebih besar dari maksimum yang didukung oleh transportasi yang mendasar.
WSAEHOSTUNREACH
Host jarak jauh tidak dapat dicapai dari host ini saat ini.
WSAECONNABORTED
Sirkuit virtual dihentikan karena waktu habis atau kegagalan lainnya. Aplikasi harus menutup soket karena tidak lagi dapat digunakan.
WSAECONNRESET
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.
WSAEADDRNOTAVAIL
Alamat jarak jauh bukan alamat yang valid, misalnya, ADDR_ANY.
WSAEAFNOSUPPORT
Alamat dalam keluarga yang ditentukan tidak dapat digunakan dengan soket ini.
WSAEDESTADDRREQ
Alamat tujuan diperlukan.
WSAENETUNREACH
Jaringan tidak dapat dijangkau dari host ini saat ini.
WSAEHOSTUNREACH
Operasi soket dicoba ke host yang tidak dapat dijangkau.
WSAETIMEDOUT
Koneksi telah terputus, karena kegagalan jaringan atau karena sistem di ujung lain tidak berfungsi tanpa pemberitahuan.

Keterangan

Fungsi sendto digunakan untuk menulis data keluar pada soket. Untuk soket berorientasi pesan, perawatan harus dilakukan agar tidak melebihi ukuran paket maksimum subnet yang mendasar, yang dapat diperoleh dengan menggunakan getsockopt untuk mengambil nilai opsi soket SO_MAX_MSG_SIZE. Jika data terlalu panjang untuk diteruskan secara atomik melalui protokol yang mendasar, kesalahan WSAEMSGSIZE dikembalikan dan tidak ada data yang dikirimkan.

Parameter to dapat menjadi alamat yang valid dalam keluarga alamat soket, termasuk siaran atau alamat multicast apa pun. Untuk mengirim ke alamat siaran, aplikasi harus menggunakan setsockopt dengan SO_BROADCAST diaktifkan. Jika tidak, sendto akan gagal dengan kode kesalahan WSAEACCES. Untuk TCP/IP, aplikasi dapat mengirim ke alamat multicast apa pun (tanpa menjadi anggota grup).

Catatan Jika soket dibuka, panggilan setsockopt dilakukan, dan kemudian panggilan sendto dilakukan, Windows Sockets melakukan panggilan fungsi ikatan implisit.
 
Jika soket tidak terikat, nilai unik ditetapkan ke asosiasi lokal oleh sistem, dan soket kemudian ditandai sebagai terikat. Jika soket tersambung, fungsi getsockname dapat digunakan untuk menentukan alamat IP lokal dan port yang terkait dengan soket.

Jika soket tidak tersambung,
fungsi getsockname dapat digunakan untuk menentukan nomor port lokal yang terkait dengan soket tetapi alamat IP yang dikembalikan diatur ke alamat wildcard untuk protokol yang diberikan (misalnya, INADDR_ANY atau "0.0.0.0" untuk IPv4 dan IN6ADDR_ANY_INIT atau "::" untuk IPv6).

Keberhasilan penyelesaian sendto tidak menunjukkan bahwa data berhasil dikirimkan.

Fungsi sendto biasanya digunakan pada soket tanpa koneksi untuk mengirim datagram ke soket serekan tertentu yang diidentifikasi oleh parameter ke . Bahkan jika soket tanpa koneksi sebelumnya telah terhubung ke alamat tertentu, parameter to mengambil alih alamat tujuan hanya untuk datagram tertentu. Pada soket berorientasi koneksi, parameter tolen ke dan tolen diabaikan, menjadikan sendto setara untuk dikirim.

Catatan Saat mengeluarkan panggilan Winsock pemblokiran seperti sendto, 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 sendto .
#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;
    WSADATA wsaData;

    SOCKET SendSocket = INVALID_SOCKET;
    sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    char SendBuf[1024];
    int BufLen = 1024;

    //----------------------
    // 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 sending data
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Set up the RecvAddr structure with the IP address of
    // the receiver (in this example case "192.168.1.1")
    // and the specified port number.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = inet_addr("192.168.1.1");

    //---------------------------------------------
    // Send a datagram to the receiver
    wprintf(L"Sending a datagram to the receiver...\n");
    iResult = sendto(SendSocket,
                     SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
        closesocket(SendSocket);
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // When the application is finished sending, close the socket.
    wprintf(L"Finished sending. Closing socket.\n");
    iResult = closesocket(SendSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Clean up and quit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;
}


Untuk Soket Menggunakan IP (Versi 4)

Untuk mengirim siaran (hanya pada SOCK_DGRAM), alamat yang ditujukan oleh parameter ke dapat dibangun untuk berisi alamat IPv4 khusus INADDR_BROADCAST (didefinisikan dalam Winsock2.h), bersama dengan nomor port yang dimaksudkan. Jika alamat yang ditujukan oleh parameter ke berisi alamat INADDR_BROADCAST dan port yang dimaksudkan, maka siaran akan dikirim pada semua antarmuka ke port tersebut.

Jika siaran harus dikirim hanya pada antarmuka tertentu, maka alamat yang diarahkan oleh parameter ke harus berisi alamat siaran subnet untuk antarmuka dan port yang dimaksudkan. Misalnya, alamat jaringan IPv4 192.168.1.0 dengan subnet mask 255.255.255.0 akan menggunakan alamat siaran subnet 192.168.1.255.

Umumnya tidak dapat dihindari untuk datagram siaran melebihi ukuran di mana fragmentasi dapat terjadi, yang menyiratkan bahwa bagian data dari datagram (tidak termasuk header) tidak boleh melebihi 512 byte.

Jika tidak ada ruang buffer yang tersedia dalam sistem transportasi untuk menyimpan data yang akan ditransmisikan, sendto akan memblokir kecuali soket telah ditempatkan dalam mode nonblocking. Pada soket yang tidak diblokir, streaming soket berorientasi, jumlah byte yang ditulis dapat antara 1 dan panjang yang diminta, tergantung pada ketersediaan buffer pada sistem klien dan server. Fungsi pilih, WSAAsyncSelect atau WSAEventSelect dapat digunakan untuk menentukan kapan mungkin untuk mengirim lebih banyak data.

Memanggil sendto dengan lensa nol diizinkan dan akan mengembalikan nol sebagai nilai yang valid. Untuk soket berorientasi pesan, datagram transportasi panjang nol dikirim.

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_DONTROUTE Menentukan bahwa data tidak boleh tunduk pada perutean. Penyedia layanan Windows Sockets dapat memilih untuk mengabaikan bendera ini.
MSG_OOB Mengirim data OOB (soket gaya aliran seperti hanya SOCK_STREAM).
 

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

Lihat juga

WSAAsyncSelect

WSAEventPilih

Fungsi Winsock

Referensi Winsock

recv

recvfrom

pilih

Mengirim

soket