fungsi bind (winsock2.h)
Fungsi pengikatan
Sintaksis
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Parameter
[in] s
Deskriptor yang mengidentifikasi soket yang tidak terikat.
[in] name
Penunjuk ke struktur sockaddr
[in] namelen
Panjangnya, dalam byte, dari nilai yang ditujukkan oleh nama parameter.
Mengembalikan nilai
Jika tidak ada kesalahan yang terjadi, mengikat mengembalikan nol. Jika tidak, kode tersebut mengembalikan SOCKET_ERROR, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.
Kode kesalahan | Arti |
---|---|
|
|
|
Subsistem jaringan gagal. |
|
Upaya dilakukan untuk mengakses soket dengan cara yang dilarang oleh izin aksesnya.
Kesalahan ini dikembalikan jika upaya untuk mengikat soket datagram ke alamat siaran gagal karena opsi setsockopt |
|
Hanya satu penggunaan setiap alamat soket (protokol/alamat jaringan/port) yang biasanya diizinkan.
Kesalahan ini dikembalikan jika proses pada komputer sudah terikat ke alamat yang sepenuhnya memenuhi syarat yang sama dan soket belum ditandai untuk mengizinkan penggunaan kembali alamat dengan SO_REUSEADDR. Misalnya, alamat IP dan port yang ditentukan dalam parameter nama |
Alamat yang diminta tidak valid dalam konteksnya.
Kesalahan ini dikembalikan jika alamat yang ditentukan yang ditujukan oleh parameter nama |
|
Sistem mendeteksi alamat penunjuk yang tidak valid dalam mencoba menggunakan argumen penunjuk dalam panggilan.
Kesalahan ini dikembalikan jika parameter nama |
|
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Argumen yang tidak valid disediakan.
Kesalahan ini dikembalikan dari soket |
|
|
Operasi pada soket tidak dapat dilakukan karena sistem tidak memiliki ruang buffer yang cukup atau karena antrean penuh.
Kesalahan ini dikembalikan karena tidak tersedia cukup buffer atau ada terlalu banyak koneksi. |
|
Operasi dicoba pada sesuatu yang bukan soket.
Kesalahan ini dikembalikan jika deskriptor dalam parameter |
Komentar
Fungsi pengikatan
Ketika soket dibuat dengan panggilan ke fungsi soket
Nama terdiri dari tiga bagian saat menggunakan keluarga alamat Internet:
- Keluarga alamat.
- Alamat host.
- Nomor port yang mengidentifikasi aplikasi.
Di Windows Sockets 2, nama
Jika aplikasi tidak peduli alamat lokal apa yang ditetapkan, tentukan nilai konstanta
Untuk TCP/IP, jika port ditentukan sebagai nol, penyedia layanan menetapkan port unik ke aplikasi dari rentang port klien dinamis. Pada Windows Vista dan yang lebih baru, rentang port klien dinamis adalah nilai antara 49152 dan 65535. Ini adalah perubahan dari Windows Server 2003 dan sebelumnya di mana rentang port klien dinamis adalah nilai antara 1025 dan 5000. Nilai maksimum untuk rentang port dinamis klien dapat diubah dengan mengatur nilai di bawah kunci registri berikut:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Nilai registri MaxUserPort menetapkan nilai yang akan digunakan untuk nilai maksimum rentang port klien dinamis. Anda harus memulai ulang komputer agar setelan ini berlaku.
Pada Windows Vista dan yang lebih baru, rentang port klien dinamis dapat dilihat dan diubah menggunakan perintah netsh
Aplikasi dapat menggunakan getsockname setelah memanggil mengikat untuk mempelajari alamat dan port yang telah ditetapkan ke soket. Jika alamat Internet sama dengan INADDR_ANY atau in6addr_any, getsockname tidak selalu dapat menyediakan alamat sampai soket tersambung, karena beberapa alamat dapat valid jika host multihomed. Pengikatan ke nomor port tertentu selain port 0 tidak disarankan untuk aplikasi klien, karena ada bahaya bertentangan dengan soket lain yang sudah menggunakan nomor port tersebut di komputer lokal.
Untuk operasi multicast, metode yang disukai adalah memanggil fungsi pengikatan
Fungsi pengikatan
Catatan untuk Soket IrDA
- File header Af_irda.h harus disertakan secara eksplisit.
- Nama lokal tidak diekspos di IrDA. Oleh karena itu, soket klien IrDA tidak boleh memanggil fungsi pengikatan
sebelum ikatanmenyambungkan fungsi . Jika soket IrDA sebelumnya terikat ke nama layanan menggunakan, fungsi connect akan gagal dengan SOCKET_ERROR. - Jika nama layanan adalah bentuk "LSAP-SELxxx," di mana xxx adalah bilangan bulat desimal dalam rentang 1-127, alamat menunjukkan LSAP-SEL xxx tertentu daripada nama layanan. Nama layanan seperti ini memungkinkan aplikasi server untuk menerima koneksi masuk yang diarahkan ke LSAP-SEL tertentu, tanpa terlebih dahulu melakukan kueri nama layanan ISA untuk mendapatkan LSAP-SEL terkait. Salah satu contoh jenis nama layanan ini adalah perangkat non-Windows yang tidak mendukung IAS.
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 pada Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Contoh
Contoh berikut menunjukkan penggunaan fungsi ikatan
#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()
{
// Declare some variables
WSADATA wsaData;
int iResult = 0; // used to return function results
// the listening socket to be created
SOCKET ListenSocket = INVALID_SOCKET;
// The socket address to be passed to bind
sockaddr_in service;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
//----------------------
// Bind the socket.
iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
else
wprintf(L"bind returned success\n");
WSACleanup();
return 0;
}
Persyaratan
Syarat | 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] |
Platform Target |
Windows |
Header |
winsock2.h (termasuk Winsock2.h) |
Pustaka |
Ws2_32.lib |
DLL |
Ws2_32.dll |
Lihat juga
Opsi Soket
Menggunakan SO_REUSEADDR dan SO_EXCLUSIVEADDRUSE
Referensi
setsockopt
sockaddr
soket