Листинг 2 – Пример клиента, использующего потоковые сокеты
/*
Код клиента на языке Си */
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<unistd.h>
int
main(void)
{
/*структура
для адресной информации*/
struct
sockaddr_in stSockAddr;
int
errRes;
/*1.создание
клиентского сокета для взаимодействия
с сервером*/
int
clientSocketFD =
socket(PF_INET,
SOCK_STREAM,
IPPROTO_TCP);
if
(clientSocketFD == -1) {
perror("Ошибка:
невозможно создать сокет");
return
EXIT_FAILURE;
}
/*Обнуляем
и заполняем структуру, описывающую
адресную информацию сервера*/
memset(&stSockAddr,
0,
sizeof
(stSockAddr));
stSockAddr.sin_family
= PF_INET;
stSockAddr.sin_port
= htons(1100);
errRes
=
inet_pton(PF_INET,
"127.0.0.1",
&stSockAddr.sin_addr);
if
(errRes < 0) {
perror("Ошибка:
первый параметр не относится к категории
корректных адресов");
close(clientSocketFD);
return
EXIT_FAILURE;
}
else if (!errRes) {
perror("Ошибка:
второй параметр не содержит корректного
IP-адреса");
close(clientSocketFD);
return
EXIT_FAILURE;
}
/*2.
Подключаемся */
if
(connect(clientSocketFD,
(const
void*)
&stSockAddr,
sizeof
(stSockAddr))
== -1)
{
perror("Ошибка:
соединения");
close(clientSocketFD);
return
EXIT_FAILURE;
}
/*
выполнение операций чтения и записи
... */
shutdown(clientSocketFD,
SHUT_RDWR);
close(clientSocketFD);
return
0;
}