Существует простой способ проверить состояние соединения через сокет poll
. Во-первых, вам нужно опросить сокет, имеет ли он событие POLLIN
.
- Если сокет не закрыт и есть данные для чтения, то
read
вернет больше нуля.
- Если в сокете нет новых данных, то
POLLIN
будет установлено в 0 в revents
- Если сокет закрыт, то флаг
POLLIN
будет установлен в единицу, и чтение вернет 0.
Вот небольшой фрагмент кода:
int client_socket_1, client_socket_2;
if ((client_socket_1 = accept(listen_socket, NULL, NULL)) < 0)
{
perror("Unable to accept s1");
abort();
}
if ((client_socket_2 = accept(listen_socket, NULL, NULL)) < 0)
{
perror("Unable to accept s2");
abort();
}
pollfd pfd[]={{client_socket_1,POLLIN,0},{client_socket_2,POLLIN,0}};
char sock_buf[1024];
while (true)
{
poll(pfd,2,5);
if (pfd[0].revents & POLLIN)
{
int sock_readden = read(client_socket_1, sock_buf, sizeof(sock_buf));
if (sock_readden == 0)
break;
if (sock_readden > 0)
write(client_socket_2, sock_buf, sock_readden);
}
if (pfd[1].revents & POLLIN)
{
int sock_readden = read(client_socket_2, sock_buf, sizeof(sock_buf));
if (sock_readden == 0)
break;
if (sock_readden > 0)
write(client_socket_1, sock_buf, sock_readden);
}
}