Що таке програмування сокетів?
Програмування сокетів — це спосіб з’єднання двох вузлів у мережі для спілкування один з одним. Один сокет (вузол) прослуховує певний порт на IP-адресі, тоді як інший сокет зв’язується з іншим, щоб створити з’єднання. Сервер формує сокет слухача, поки клієнт звертається до сервера.
Діаграма стану для моделі сервера та клієнта

Діаграма стану для моделі сервера та клієнта Socket
Етапи для сервера
Сервер створюється за допомогою наступних кроків:
рядкові функції java
1. Створення сокета
int sockfd = socket(domain, type, protocol)>
- sockfd: дескриптор сокета, ціле число (як дескриптор файлу) domain: ціле число, визначає домен зв’язку. Ми використовуємо AF_ LOCAL, як визначено в стандарті POSIX для зв’язку між процесами на одному хості. Для обміну даними між процесами на різних хостах, підключених за допомогою IPV4, ми використовуємо AF_INET і AF_I NET 6 для процесів, підключених за допомогою IPV6. тип: тип спілкування
SOCK_STREAM: TCP (надійний, орієнтований на підключення)
SOCK_DGRAM: протокол UDP (ненадійний, без підключення): значення протоколу для Інтернет-протоколу (IP), яке дорівнює 0. Це те саме число, яке відображається в полі протоколу в IP-заголовку пакета. (протоколи man для отримання додаткової інформації)
2. Сецкопт
Це допомагає маніпулювати параметрами для сокета, на який посилається дескриптор файлу sockfd. Це абсолютно необов’язково, але це допомагає повторно використовувати адресу та порт. Запобігає помилкам, таким як: адреса вже використовується.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Зв'язати
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Після створення сокета функція прив’язування прив’язує сокет до адреси та номера порту, указаних у addr(спеціальна структура даних). У прикладі коду ми прив’язуємо сервер до локального хосту, тому ми використовуємо INADDR_ANY для визначення IP-адреси.
4. Слухайте
int listen(int sockfd, int backlog);>
Він переводить сокет сервера в пасивний режим, де він чекає, поки клієнт підійде до сервера, щоб встановити з’єднання. Backlog визначає максимальну довжину, до якої може зрости черга незавершених підключень для sockfd. Якщо запит на підключення надходить, коли черга заповнена, клієнт може отримати повідомлення про помилку з індикацією ECONNREFUSED.
5. Прийняти
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Він витягує перший запит на з’єднання з черги очікуваних з’єднань для прослуховуваного сокета, sockfd, створює новий підключений сокет і повертає новий файловий дескриптор, що посилається на цей сокет. У цей момент між клієнтом і сервером встановлено з’єднання, і вони готові до передачі даних.
Етапи для клієнта
1. Розетка підключення: Точно так само, як і створення сокета сервера
2. Підключити: Системний виклик connect() з’єднує сокет, на який посилається дескриптор файлу sockfd, з адресою, вказаною в addr. Адреса та порт сервера вказані в адресі.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Реалізація
Тут ми обмінюємося одним повідомленням привітання між сервером і клієнтом, щоб продемонструвати модель клієнт/сервер.
C Програма для створення сервера
Server.c
C
перейменувати каталог linux
// Server side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> server_fd, new_socket;> >ssize_t valread;> >struct> sockaddr_in address;> >int> opt = 1;> >socklen_t addrlen =>sizeof>(address);> >char> buffer[1024] = { 0 };> >char>* hello =>'Hello from server'>;> >// Creating socket file descriptor> >if> ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >perror>(>'socket failed'>);> >exit>(EXIT_FAILURE);> >}> >// Forcefully attaching socket to the port 8080> >if> (setsockopt(server_fd, SOL_SOCKET,> >SO_REUSEADDR | SO_REUSEPORT, &opt,> >sizeof>(opt))) {> >perror>(>'setsockopt'>);> >exit>(EXIT_FAILURE);> >}> >address.sin_family = AF_INET;> >address.sin_addr.s_addr = INADDR_ANY;> >address.sin_port = htons(PORT);> >// Forcefully attaching socket to the port 8080> >if> (bind(server_fd, (>struct> sockaddr*)&address,> >sizeof>(address))> ><0) {> >perror>(>'bind failed'>);> >exit>(EXIT_FAILURE);> >}> >if> (listen(server_fd, 3) <0) {> >perror>(>'listen'>);> >exit>(EXIT_FAILURE);> >}> >if> ((new_socket> >= accept(server_fd, (>struct> sockaddr*)&address,> >&addrlen))> ><0) {> >perror>(>'accept'>);> >exit>(EXIT_FAILURE);> >}> >valread = read(new_socket, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >send(new_socket, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >// closing the connected socket> >close(new_socket);> >// closing the listening socket> >close(server_fd);> >return> 0;> }> |
>
>
C Програма для створення клієнта
client.c
C
css для обтікання текстом
// Client side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> status, valread, client_fd;> >struct> sockaddr_in serv_addr;> >char>* hello =>'Hello from client'>;> >char> buffer[1024] = { 0 };> >if> ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >printf>(>'
Socket creation error
'>);> >return> -1;> >}> >serv_addr.sin_family = AF_INET;> >serv_addr.sin_port = htons(PORT);> >// Convert IPv4 and IPv6 addresses from text to binary> >// form> >if> (inet_pton(AF_INET,>'127.0.0.1'>, &serv_addr.sin_addr)> ><= 0) {> >printf>(> >'
Invalid address/ Address not supported
'>);> >return> -1;> >}> >if> ((status> >= connect(client_fd, (>struct> sockaddr*)&serv_addr,> >sizeof>(serv_addr)))> ><0) {> >printf>(>'
Connection Failed
'>);> >return> -1;> >}> >send(client_fd, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >valread = read(client_fd, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >// closing the connected socket> >close(client_fd);> >return> 0;> }> |
>
>
Вихід
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Компіляція
gcc client.c -o client gcc server.c -o server>
Далі: програмування сокетів на C/C++: робота з декількома клієнтами на сервері без багатопоточності