Как определить, готов ли сетевой стек снова открыть сокет для того же хоста / порта?

У меня есть следующая программа на C, основная функция которой runTCPConnectivityCheck открывает сокет TCP, отправляет на него строку байтов и закрывает ее:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static int runTCPConnectivityCheck(const int port)
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0)
{
printf("socket failed\n");
return 1;
}

int reuseAddrTrue = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseAddrTrue, sizeof(reuseAddrTrue)) != 0)
{
printf("setsockopt failed\n");
return 1;
}

struct sockaddr_in serv_addr = { 0 };
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);

if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) != 1)
{
printf("inet_pton failed\n");
return 1;
}

if (connect(fd, (struct sockaddr*)(&serv_addr), sizeof(serv_addr)) != 0)
{
printf("connect failed\n");
return 1;
}

const char* message = "hello";
const size_t messageLength = strlen(message);
if (send(fd, message, messageLength, 0) != messageLength)
{
printf("send failed\n");
return 1;
}

shutdown(fd, SHUT_RDWR);
close(fd);

return 0;
}

int main()
{
for (int i = 0; i < 10; ++i)
{
printf("%s\n", runTCPConnectivityCheck(5555) == 0 ? "success" : "failure");
//sleep(1);
}
}

Если я попытаюсь проверить один и тот же порт несколько раз, первый вызов runTCPConnectivityCheck работает просто отлично, но все последующие вызовы терпят неудачу при вызове connect, Если я добавлю вызов sleep в, то это тоже работает. Предположительно, задержка в 1 секунду дает сетевому стеку достаточно времени для очистки сокета, чтобы я мог снова подключиться к тому же порту.

Прежде всего: правильно ли я выключаю розетку? Во-вторых: если я выключаю его должным образом, каков стандартный способ определить, готов ли сетевой стек снова подключиться к тому же хосту и порту (вместо lame)? sleep Я пользуюсь сейчас)?

Обновить

Больше деталей: connect сбой с кодом ошибки 61 или ECONNREFUSED в то время как strerror возвращается «Соединение отказано».

Сервер в этом случае является netstat/nc Команда выполняется в цикле на той же машине, что и тестовая программа:

#!/bin/bash
while true; do
nc -l 5555
done

Программа сейчас C, по-настоящему.

1

Решение

Общее мнение заключается в том, что нет ничего особенно плохого в клиентском коде. Оказывается, мой тестовый сервер не в состоянии угнаться за моим клиентом:

#!/bin/bash
while true; do
nc -l 5555
done

Я написал разветвленный сервер на Python, который может без проблем обслуживать все клиентские соединения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]