У меня есть протокол подключения, который был определен нашим клиентом. Данные передаются между двумя компьютерами Linux с использованием протоколов UDP и TCP. IP-адреса и порты фиксируются при запуске.
Мы отправляем сообщения с частотой 200 Гц, и я использую соединение, чтобы сэкономить время на передачах.
Моя проблема в том, что в случае ошибки связи мне нужно разорвать соединения и повторно инициализировать.
У меня проблема с одним из соединений UDP, так как он не будет повторно привязан к нужному адресу и возвращает errno 22.
Код, который я использую, выглядит примерно так:
int
doConnect(int& sock, int local_port, char *local_ip, int remote_port, char *remote_ip)
{
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in);
addr.sin_family = AF_INET;
addr.sin_port = htons(local_port);
inet_pton(local_ip,&addr.sin_addr.s_addr);
if (0 > bind(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
printf("Bind Error errno = %d\n", errno);
return ERR_BIND;
}
memset(&addr, 0, sizeof(sockaddr_in);
addr.sin_family = AF_INET;
addr.sin_port = htons(remote_port);
inet_pton(remote_ip,&addr.sin_addr.s_addr);
if (0 > connect(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
printf("Connect Error errno = %d\n", errno);
return ERR_CONNECT;
}
return ERR_OK;
}
Способ, которым это используется, выглядит следующим образом:
int s1(-1), s2(-1);
doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1");
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1");
При возникновении ошибки
close(s1);
close(s2);
doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1");
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1");
Здесь локальный адрес 172.17.21.3, и я подключаюсь к 172.17.21.1. s1 прослушивает широковещательное сообщение.
s1 успешно переподключается к удаленному компьютеру, но s2 завершается ошибкой с ошибкой 22 от вызова для привязки.
Я попытался явно вызвать bind и подключиться к адресу AF_UNSPEC непосредственно перед тем, как закрыть сокет. Это не решает проблему.
Есть ли варианты, которые я должен использовать?