Panggil urutan untuk TCP, UDP connectionless, dan UDP untuk protokol Koneksi klien sederhana.

Tabel 10.2. Panggil urutan untuk TCP, UDP connectionless, dan UDP untuk protokol Koneksi klien sederhana.

seputar :

TCP Klien UDP UDP Connectionless Terhubung

– soket soket soket

– menghubungkan menghubungkan

– send-recv
– menutup

– sendto-recvfrom
– send-recv

– menutup

Sebuah TCP Server Sederhana

Sekarang kita tahu bagaimana untuk menghubungkan ke server dan bertukar informasi dengan itu, kami siap untuk melihat di ujung lain kawat. Berhati-hatilah, meskipun, coding server adalah proses yang sangat terlibat.

Untuk mulai dengan, server harus dapat bertukar informasi dengan rekan-rekan banyak sekaligus. Hal ini dapat dicapai baik dengan pemindaian berurutan soket terbuka (dengan cara Nonblocking atau kita mungkin mendapat masalah) atau dengan menulis sebuah server yang berjalan bersamaan beberapa proses secara paralel, masing-masing dengan soket sendiri dan peer.

Untuk memulai diskusi kita dari server, kita akan fokus pada server tunggal-peer. Ini harus cukup untuk dua pemain game dan akan berfungsi sebagai dasar dari mana kita akan beralih ke solusi yang terlibat lebih banyak.

Dalam skenario dua pemain, kita tidak perlu khawatir tentang beberapa soket sekaligus karena kita berada dalam situasi satu-ke-satu. Tapi ini bukan hubungan yang simetris. Klien dan server memainkan peran yang berbeda dan dengan demikian perlu panggilan sistem yang berbeda.

Sebagai langkah pertama, server harus membuat soket sendiri dan memasukkannya ke dalam mode “mendengarkan”. Dalam mode ini, soket dibiarkan terbuka pada port tertentu, sehingga menunggu permintaan koneksi masuk dari klien. Sebagai koneksi baru tiba, urutan pengaturan singkat terjadi dan transfer data bisa dimulai. Jadi, mari kita fokus pada inisialisasi server TCP kami. Seperti biasa, semuanya dimulai dengan penciptaan socket. Proses ini identik dengan sisi klien dan dilakukan dengan menggunakan baris:

int sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

Sekarang, kita harus membuat hubungan antara socket dan pasangan alamat / IP port. Dengan cara ini kami menyatakan bahwa soket akan mencari permintaan sambungan tiba melalui titik masuk. Anda mungkin bertanya mengapa kita harus menentukan alamat IP untuk mendengarkan jika kita tahu server mana kita berada. Jawabannya terletak pada sifat dari server Internet. Server Internet mungkin diketahui oleh alamat IP yang berbeda (alias ke IP base). Jadi, kita perlu menentukan apakah kita ingin soket untuk menanggapi hanya satu dari alamat tersebut. Namun, kebanyakan server akan ingin menanggapi permintaan tiba di salah satu alamat IP server diidentifikasi dengan, jadi perintah khusus akan memungkinkan kita untuk menentukan semua alamat sekaligus. Secara keseluruhan, ini mengikat antara soket dan IP / pasangan port yang dilakukan oleh panggilan mengikat, yang prototipe adalah sebagai berikut:

int bind (int soket, sockaddr * s, int saddrlen);

Kita akan menggunakan sockaddr (sockaddr_in dalam kasus server Internet) untuk menentukan IP / pasangan port. Berikut adalah kode inisialisasi yang tepat untuk seperti panggilan:

struct sockaddr_in adr;

adr.sin_family = AF_INET; adr.sin_port = htons (port); adr.sin_addr.s_addr = INADDR_ANY; ZeroMemory (adr.sin_zero, 8);

bind (soket, (struct sockaddr *) & adr, sizeof (adr));
Perhatikan penggunaan kartu liar INADDR_ANY untuk menentukan bahwa kita ingin merespon menggunakan salah satu alias server dikenal dengan. Atau, kita bisa menentukan secara manual alamat IP untuk soket untuk merespon secara eksklusif. Bahwa alamat IP dapat dengan mudah diambil dari gethostbyname () nilai kembali. Setelah selesai, bind () akan mengembalikan nilai integer, yang akan menjadi nol jika panggilan berhasil dan -1 sebaliknya. Kesalahan populer termasuk soket yang terdefinisi atau sudah terikat, atau pasangan IP / port yang sudah digunakan oleh layanan lain.

Sekarang server Anda dan berjalan, dan OS yang tahu alamat dan port itu pasti akan. Dengan demikian, sekarang saatnya untuk memasuki mode pasif atau, dengan kata lain, menempatkan server untuk tidur sambil menunggu koneksi. Ini dilakukan dengan menggunakan panggilan mendengarkan (), yang membuat server menunggu koneksi masuk:

int mendengarkan (soket int, int queuelen);

Seperti biasa, parameter pertama adalah soket untuk bekerja dengan. Parameter kedua memungkinkan programmer untuk menentukan panjang antrian koneksi. Stack TCP / IP akan mengantri untuk queuelen koneksi sementara server menangani permintaan lain. Ketika Anda akan segera melihat, server bisa sibuk mengurus satu koneksi peserta. Untuk mencegah koneksi lain dari hilang saat proses ini berlangsung, Anda dapat menyimpan mereka dalam antrian untuk digunakan nanti. Secara tradisional, queuelen memiliki ukuran maksimum lima, yang memungkinkan koneksi ke enam menjadi “ditahan” sementara server menangani satu rekan.

Hanya ada satu panggilan di depan kita dalam proses memulai server kami. Telepon ini secara efektif menempatkan server ditahan sampai sambungan baru terjadi. Panggilan ini

int menerima (int soket, sockaddr * addr, int * addrlen);

Terima tetap diblokir sampai sambungan baru terjadi. Parameternya adalah soket kita mendengarkan dari dan sepasang sockaddr / panjang yang akan menyimpan data dari klien, terutama IP dan alamat DNS. Sebagai hasil dari panggilan menerima (), kita akan menerima baik -1 jika ada kesalahan, atau soket nonnegatif
deskriptor. Ini socket baru diaktifkan dan siap untuk mentransfer data dengan klien, sedangkan soket awal tetap tak tersentuh sehingga kami dapat terus menerima koneksi.

Setelah menerima, kami siap untuk mulai bekerja dengan klien kami dengan cara recv-kirim. Sebagai ringkasan dari hubungan client-server, lihat Gambar 10.1. Perhatikan bahwa server harus dalam menerima () negara untuk dapat menerima koneksi. Jelas, ini berarti bahwa proses boot sisi server harus sudah terjadi.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s