Pengaturcaraan Soket dalam C++

Pengaturcaraan Soket Dalam C



Pengaturcaraan soket telah menjadi subjek penting dalam bidang rangkaian komputer. Ia melibatkan mewujudkan sambungan antara dua nod, pelayan, dan klien untuk berkomunikasi antara satu sama lain tanpa sebarang gangguan. Pelayan bertindak sebagai pendengar dalam saluran komunikasi dan mendengar klien pada port tertentu pada alamat IP. Sebaliknya, klien bertindak sebagai komunikator dalam saluran komunikasi. Pelanggan menghubungi pelayan untuk membuat sambungan dan membuat hubungan dengan pelayan. Artikel ini bertujuan untuk menyediakan panduan yang komprehensif dan terperinci untuk pengaturcaraan soket dalam C++, meliputi asas, membentangkan contoh praktikal dan memberikan penjelasan terperinci tentang kod.

Menubuhkan Model Pelayan Pelanggan

Pengaturcaraan soket ialah proses yang membina saluran komunikasi antara pelayan dan klien menggunakan soket. Dalam kod contoh berikut, klien memulakan kenalan dengan pelayan, dan pelayan disediakan untuk menerima sambungan klien. Marilah kita memahami segmen kod pelayan dan klien dengan menunjukkan teras mereka berfungsi dalam komunikasi rangkaian. Berikut ialah kod sebelah pelayan. Mari kita lihat kod dahulu dan kemudian terangkan kod secara terperinci, titik demi titik.

1. Bahagian Pelayan







Kod untuk bahagian pelayan model diberikan dalam perkara berikut. Mari kita lihat apa yang berlaku dalam kod:



#include
#include
#include
#include

menggunakan ruang nama std ;

#define PORT 8080
#tentukan MAX_BUF_SIZE 1024

int utama ( ) {
int ser_socket, cli_socket ;
struct sockaddr_in ser_address, cli_address ;
char buf [ MAX_BUF_SIZE ] = { 0 } ;

jika ( ( ser_socket = soket ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
kesalahan ( 'Ralat dalam penciptaan Soket' ) ;
keluar ( EXIT_FAILURE ) ;
}

ser_address. dosa_keluarga = OF_INET ;
ser_address. sin_addr . s_addr = INADDR_ANY ;
ser_address. pelabuhan_dosa = htons ( PELABUHAN ) ;

jika ( mengikat ( be_socket, ( struct sockaddr * ) & ser_address, saiz ( ser_address ) ) == - 1 ) {
kesalahan ( 'Kegagalan dalam ikatan' ) ;
keluar ( EXIT_FAILURE ) ;
}

jika ( dengar ( be_socket, 3 ) == - 1 ) {
kesalahan ( 'Gagal Mendengar' ) ;
keluar ( EXIT_FAILURE ) ;
}

cout << 'Pelayan mendengar pada port' << PELABUHAN << '... \n ' ;

socklen_t cli_address_len = saiz ( cli_address ) ;
jika ( ( cli_socket = terima ( be_socket, ( struct sockaddr * ) & cli_address, & cli_address_len ) ) == - 1 ) {
kesalahan ( 'Gagal terima' ) ;
keluar ( EXIT_FAILURE ) ;
}

membaca ( cli_socket, buf, MAX_BUF_SIZE ) ;
cout << 'Mesej pelanggan ialah:' << buf << endl ;

hantar ( cli_socket, 'Mesej pelayan' , strlen ( 'Mesej pelayan' ) , 0 ) ;

dekat ( cli_socket ) ;
dekat ( ser_socket ) ;

kembali 0 ;
}

Contoh yang diberikan ialah kod sisi pelayan program C++. Kod ini berfungsi untuk pelayan TCP mudah untuk mendengar sambungan pada satu port tertentu. Apabila sambungan berjaya dibuat, pelayan akan menerima mesej yang dihantar daripada klien. Selepas itu, ia mencetaknya pada konsol dan menghantar mesej respons kepada pelanggan. Marilah kita memahami setiap baris kod.



Program ini bermula dengan memasukkan perpustakaan: 'iostream' untuk definisi input/output standard, 'cstring' untuk fungsi pengendalian rentetan, 'unistd.h' untuk menyediakan akses kepada API sistem pengendalian POSIX dan 'arpa/inet.h' kepada melaksanakan operasi internet. Pernyataan '#define PORT 8080' bermaksud ia mentakrifkan nombor port 8080 yang pelayan akan mendengar. “#define MAX_BUF_SIZE 1024” bermaksud saiz penimbal maksimum untuk data masuk iaitu 1024.





Dalam fungsi utama, dua pembolehubah dimulakan, 'ser_socket' dan 'cli_socket', untuk mewakili kedua-dua pelayan dan klien, masing-masing. Tiga pembolehubah lain iaitu 'sockaddr_in', 'ser_address', dan 'cli_address' jenis 'struct' dimulakan sebagai struktur alamat untuk pelayan dan klien. Selepas itu, penimbal bernama 'buf' dimulakan yang menyimpan data yang datang daripada klien.

Fungsi socket() dalam keadaan “if” mencipta soket TCP baharu. AF_INET menandakan IPv4, SOCK_STREAM mewakili soket TCP berorientasikan sambungan dan boleh dipercayai, hujah terakhir iaitu 0 diberikan untuk memilih protokol TCP lalai, INADDR_ANY menerima sambungan pada mana-mana alamat IP, dan htons (PORT) menukar nombor port daripada perintah bait hos kepada susunan bait rangkaian.



Memandangkan semuanya ditakrifkan dengan betul, langkah seterusnya ialah menyediakan pelayan sebagai penyenarai pada port yang diberikan dan menerima sambungan pada mana-mana antara muka rangkaian. Soket diberikan dengan maklumat dalam 'ser_address' dengan kaedah bind(). Kami mencetak ralat dan menamatkan proses jika pengikatan gagal. Fungsi accept() membuka soket baharu untuk sambungan dengan klien, manakala fungsi listen() mengarahkan pelayan menunggu sambungan masuk. Jika fungsi accept() gagal, mesej ralat dicetak dan fungsi akan keluar.

Seterusnya, pelayan membaca mesej klien dengan fungsi read() ke dalam penimbal “buf” dan kemudian mencetaknya ke konsol. Fungsi send() digunakan oleh pelayan untuk menghantar mesej sebagai tindak balas kepada klien. Akhir sekali, menggunakan close(), pelayan menutup soket pelanggan, menamatkan program supaya semua sambungan ditutup dengan betul dan tiada kebarangkalian berlakunya pelanggaran data.

2. Bahagian Pelanggan

Sekarang, mari lihat apa yang berlaku dalam model klien:

#include
#include
#include
#include

#define PORT 8080
#define SERVER_IP '127.0.0.1'

int utama ( ) {
int cli_socket ;
struct sockaddr_in ser_address ;
const char * mesej = 'Pelanggan menghantar salam!' ;

jika ( ( cli_socket = soket ( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) {
kesalahan ( 'Ralat dalam penciptaan soket' ) ;
keluar ( EXIT_FAILURE ) ;
}

ser_address. dosa_keluarga = OF_INET ;
ser_address. pelabuhan_dosa = htons ( PELABUHAN ) ;

jika ( inet_pton ( AF_INET, SERVER_IP, & ser_address. sin_addr ) <= 0 ) {
kesalahan ( 'Salah alamat' ) ;
keluar ( EXIT_FAILURE ) ;
}

jika ( menyambung ( cli_socket, ( struct sockaddr * ) & ser_address, saiz ( ser_address ) ) == - 1 ) {
kesalahan ( 'Kegagalan sambungan' ) ;
keluar ( EXIT_FAILURE ) ;
}
hantar ( cli_socket, mesg, strlen ( mesej ) , 0 ) ;

char buf [ 1024 ] = { 0 } ;
membaca ( cli_socket, buf, saiz ( buf ) ) ;
std :: cout << 'Respons pelayan:' << buf << std :: endl ;

dekat ( cli_socket ) ;
kembali 0 ;
}

Mari kita lihat setiap baris kod untuk memahami cara program ini berfungsi.

Empat pustaka yang sama - iostream, cstring, unistd.h, dan arpa/inet.h - turut disertakan pada bahagian klien. Nombor port juga ditakrifkan bersama-sama dengan alamat IP hos tempatan 127.0.0.1. Mesej yang perlu dihantar ke pelayan diberikan. Pelanggan dan pelayan perlu mewujudkan sambungan seperti langkah berikut:

“jika ((soket_pelanggan = soket(AF_INET, SOCK_STREAM, 0)) == -1);” mencipta soket untuk IPv4 dengan jenis aliran dan protokol lalai TCP. Perror() mencetak butiran ralat jika fungsi socket() gagal mewujudkan sambungan dan keluar dari program.

“Alamat_pelayan.sin_port = htons(PORT);” menetapkan nombor port selepas menukar kepada susunan bait rangkaian. Selepas itu, satu lagi mesej kegagalan iaitu 'Alamat salah' diberikan di sini yang dicetak jika terdapat sesuatu yang salah dengan alamat. Dengan mencari alamat dalam 'ser_address', pelanggan akan menyambung ke pelayan. Jika sambungan gagal, butiran ralat akan dicetak. Fungsi send() akan memindahkan mesej ke pelayan, memastikan ia tidak mengandungi sebarang bendera.

Untuk menerima dan menyimpan respons daripada pelayan, penimbal bernama 'buf' jenis 'char' dimulakan. Fungsi read() membaca respons pelayan ke dalam penimbal. Akhirnya, respons pelayan dicetak ke konsol. Akhir sekali, sambungan ditutup menggunakan pernyataan close() untuk menamatkan soket. Berikut ialah output program:

Kesimpulan

Pengaturcaraan soket adalah bahagian penting dalam komunikasi rangkaian dalam sains komputer. Ia membolehkan pembangunan aplikasi yang boleh berkomunikasi melalui rangkaian, membolehkan pelbagai kemungkinan daripada seni bina pelayan pelanggan yang mudah kepada sistem teragih berstruktur. Apabila soket dicipta dalam konteks pengaturcaraan, program mesti mengkonfigurasi ciri titik akhirnya seperti protokol, TCP atau UDP dan alamat rangkaian seperti alamat IP dan nombor port. Soket ini membenarkan pelayan menghantar dan menerima data. Artikel ini menunjukkan contoh praktikal tentang cara model pelayan pelanggan dalam pengaturcaraan soket berfungsi.