Keduanya connect()
dan bind()
panggilan sistem 'mengasosiasikan' deskriptor file soket ke sebuah alamat (biasanya kombinasi ip / port). Prototipe mereka seperti: -
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
dan
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Apa perbedaan persis antara 2 panggilan? Kapan sebaiknya digunakan connect()
dan kapan bind()
?
Secara khusus, dalam beberapa kode klien server sampel, ditemukan bahwa klien menggunakan connect()
dan server menggunakan bind()
panggilan. Alasannya tidak sepenuhnya jelas bagi saya.
c
sockets
network-programming
Siddhartha Ghosh
sumber
sumber
Jawaban:
Untuk membuat pemahaman lebih baik, mari kita cari tahu di mana tepatnya mengikat dan terhubung menjadi gambar,
Selanjutnya untuk memposisikan dua panggilan, seperti yang dijelaskan oleh Sourav,
bind () mengasosiasikan soket dengan alamat lokalnya [itulah sebabnya sisi server mengikat, sehingga klien dapat menggunakan alamat itu untuk terhubung ke server.] connect () digunakan untuk terhubung ke alamat [server] jarak jauh, itulah mengapa sisi klien , hubungkan [baca sebagai: sambungkan ke server] digunakan.
Kami tidak dapat menggunakannya secara bergantian (bahkan ketika kami memiliki klien / server pada mesin yang sama) karena peran khusus dan implementasi yang sesuai.
Saya selanjutnya akan merekomendasikan untuk menghubungkan panggilan ini jabat tangan TCP / IP.
Jadi, siapa yang akan mengirim SYN ke sini, itu akan terhubung (). Sedangkan bind () digunakan untuk mendefinisikan titik akhir komunikasi.
Semoga ini membantu!!
sumber
Satu baris:
bind()
ke alamat sendiri,connect()
ke alamat remote.Mengutip dari halaman manual
bind()
dan, dari yang sama untuk
connect()
Untuk memperjelas,
bind()
mengaitkan soket dengan alamat lokalnya [itulah sebabnya sisi serverbind
s, sehingga klien dapat menggunakan alamat itu untuk menyambung ke server.]connect()
digunakan untuk menghubungkan ke alamat remote [server], oleh karena itu di sisi klien, digunakan koneksi [baca sebagai: sambungkan ke server].sumber
interchangeable
local
-> proses itu sendiri,remote
-> proses lainnya.bind memberi tahu proses yang sedang berjalan untuk mengklaim port. yaitu, ia harus mengikat dirinya sendiri ke port 80 dan mendengarkan permintaan masuk. dengan bind, proses Anda menjadi server. ketika Anda menggunakan connect, Anda memberi tahu proses Anda untuk terhubung ke port yang SUDAH digunakan. proses Anda menjadi klien. perbedaannya penting: bind menginginkan port yang tidak digunakan (sehingga dapat mengklaimnya dan menjadi server), dan menghubungkan menginginkan port yang sudah digunakan (sehingga dapat terhubung dan berbicara ke server)
sumber
Dari Wikipedia http://en.wikipedia.org/wiki/Berkeley_sockets#bind.28.29
Menghubung():
Panggilan sistem connect () menghubungkan soket, yang diidentifikasi oleh deskriptor filenya, ke host jarak jauh yang ditentukan oleh alamat host tersebut dalam daftar argumen.
Jenis soket tertentu tidak memiliki koneksi, soket protokol datagram pengguna yang paling umum. Untuk soket ini, hubungkan memiliki arti khusus: target default untuk mengirim dan menerima data diatur ke alamat yang diberikan, memungkinkan penggunaan fungsi seperti send () dan recv () pada soket tanpa koneksi.
connect () mengembalikan integer yang mewakili kode kesalahan: 0 mewakili sukses, sedangkan -1 mewakili kesalahan.
mengikat():
bind () memberikan soket ke alamat. Ketika soket dibuat menggunakan soket (), itu hanya diberikan keluarga protokol, tetapi tidak diberi alamat. Asosiasi dengan alamat ini harus dilakukan dengan panggilan sistem bind () sebelum soket dapat menerima koneksi ke host lain. bind () membutuhkan tiga argumen:
sockfd, deskriptor yang mewakili soket untuk melakukan pengikatan. my_addr, penunjuk ke struktur sockaddr yang mewakili alamat yang akan diikat. addrlen, bidang socklen_t yang menentukan ukuran struktur sockaddr. Bind () mengembalikan 0 jika berhasil dan -1 jika terjadi kesalahan.
Contoh: 1.) Menggunakan Connect
2.) Bind Contoh:
Saya harap itu menjelaskan perbedaannya
Harap dicatat bahwa jenis soket yang Anda nyatakan akan bergantung pada apa yang Anda butuhkan, ini sangat penting
sumber
Saya pikir itu akan membantu pemahaman Anda jika Anda memikirkan
connect()
danlisten()
sebagai rekan, daripadaconnect()
danbind()
. Alasan untuk ini adalah Anda dapat memanggil atau menghilangkanbind()
sebelumnya, meskipun jarang merupakan ide yang baik untuk memanggilnya sebelumnyaconnect()
, atau tidak memanggilnya sebelumnyalisten()
.Jika membantu untuk berpikir dalam kerangka server dan klien, itulah
listen()
ciri khas yang pertama, danconnect()
yang terakhir.bind()
dapat ditemukan - atau tidak ditemukan - di keduanya.Jika kita mengasumsikan server dan klien kita berada di mesin yang berbeda, akan lebih mudah untuk memahami berbagai fungsi.
bind()
bertindak secara lokal, yaitu mengikat akhir koneksi pada mesin yang dipanggil, ke alamat yang diminta dan memberikan port yang diminta kepada Anda. Itu melakukan itu terlepas dari apakah mesin itu akan menjadi klien atau server.connect()
memulai koneksi ke server, yang berarti menghubungkan ke alamat dan port yang diminta di server, dari klien. Server itu hampir pasti akan meneleponbind()
sebelumnyalisten()
, agar Anda dapat mengetahui alamat dan port mana yang akan dihubungkan dengannya dengan menggunakanconnect()
.Jika Anda tidak menelepon
bind()
, port dan alamat akan secara implisit ditetapkan dan terikat pada mesin lokal untuk Anda saat Anda memanggilconnect()
(klien) ataulisten()
(server). Namun, itu efek samping dari keduanya, bukan tujuan mereka. Port yang ditetapkan dengan cara ini bersifat sementara.Poin penting di sini adalah bahwa klien tidak perlu terikat, karena klien terhubung ke server, sehingga server akan mengetahui alamat dan port klien meskipun Anda menggunakan port sementara, daripada mengikat ke sesuatu yang spesifik. Di sisi lain, meskipun server dapat menelepon
listen()
tanpa meneleponbind()
, dalam skenario itu mereka perlu menemukan port sementara yang ditetapkan, dan mengomunikasikannya ke klien mana pun yang ingin disambungkan ke sana.Saya berasumsi ketika Anda menyebutkan
connect()
Anda tertarik dengan TCP, tetapi ini juga membawa ke UDP, di mana tidak meneleponbind()
sebelum yang pertamasendto()
(UDP adalah koneksi-kurang) juga menyebabkan port dan alamat secara implisit ditetapkan dan diikat. Salah satu fungsi yang tidak dapat Anda panggil tanpa pengikatan adalahrecvfrom()
, yang akan mengembalikan kesalahan, karena tanpa port yang ditetapkan dan alamat yang terikat, tidak ada yang bisa diterima (atau terlalu banyak, tergantung pada bagaimana Anda menafsirkan tidak adanya pengikatan).sumber
Terlalu panjang; Jangan Baca: Perbedaannya adalah apakah sumber (lokal) atau alamat / port tujuan sedang disetel. Singkatnya,
bind()
atur sumber danconnect()
tentukan tujuan. Terlepas dari TCP atau UDP.bind()
bind()
atur alamat (sumber) lokal soket. Ini adalah alamat dimana paket diterima. Paket yang dikirim oleh soket membawa ini sebagai alamat sumber, sehingga host lain akan tahu ke mana harus mengirim kembali paketnya.Jika menerima tidak diperlukan alamat sumber soket tidak berguna. Protokol seperti TCP mengharuskan penerimaan diaktifkan untuk mengirim dengan benar, karena host tujuan mengirim kembali konfirmasi ketika satu atau lebih paket telah tiba (yaitu pengakuan).
connect()
connect()
memicu kode TCP untuk mencoba membuat sambungan ke sisi lain.connect()
hanya mengatur alamat default ke mana paket dikirim ketika tidak ada alamat yang ditentukan. Kapanconnect()
tidak digunakan,sendto()
atausendmsg()
harus digunakan yang berisi alamat tujuan.Ketika
connect()
atau fungsi kirim dipanggil, dan tidak ada alamat yang terikat, Linux secara otomatis mengikat soket ke port acak. Untuk detail teknis, lihat diinet_autobind()
kode sumber kernel Linux.Catatan sampingan
listen()
hanya TCP.struct sockaddr_in
) terdiri dari alamat IP (lihat header IP ), dan port TCP atau UDP (lihat header TCP dan UDP ).sumber