Nano Hash - криптовалюты, майнинг, программирование

Программирование сокетов Client Connect

Я работаю с клиент-серверным программированием. Я ссылаюсь на эту ссылку, и мой сервер успешно работает .

  1. Мне нужно постоянно отправлять данные на сервер.
  2. Я не хочу подключать() каждый раз перед отправкой каждого пакета. Итак, в первый раз я просто создал сокет и отправил первый пакет, остальные данные я просто использовал с помощью функции write() для записи данных в сокет.

Но моя проблема заключается в том, что при непрерывной отправке данных, если сервера нет или мой Ethernet отключен, он все равно успешно записывает данные в сокет.

Есть ли способ, с помощью которого я могу создать сокет только сразу и непрерывно отправлять данные, зная об отказе сервера?

Основная причина этого заключается в том, что на стороне сервера я использую модем GPRS, и каждый раз, когда вызывается функция connect() для каждого пакета, модем зависает.

Для создания сокета я использую код ниже

Gprs_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (Gprs_sockfd < 0)
{
  Display("ERROR opening socket");
  return 0;
}
server = gethostbyname((const char*)ip_address);
if (server == NULL)
{               
  Display("ERROR, no such host");                
  return 0;
}

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(Gprs_sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
  Display("ERROR connecting");
  return 0;
}

И каждый раз, когда я пишу в сокет, используя приведенный ниже код

n = write(Gprs_sockfd,data,length);
if(n<0)
{
  Display("ERROR writing to socket");
  return 0;
}   

Заранее спасибо.............

10.01.2013

Ответы:


1

TCP был разработан, чтобы выдерживать временные сбои. Он выполняет упорядочивание байтов, подтверждения и, при необходимости, повторные передачи. Все неподтвержденные данные буферизуются внутри сетевого стека ядра. Если я правильно помню, по умолчанию это три попытки повторной передачи (кто-нибудь поправит меня, если я ошибаюсь) с экспоненциальным тайм-аутом отсрочки. Это быстро составляет десятки секунд, если не минут.

Мое предложение состояло бы в том, чтобы встроить в ваш протокол подтверждения уровня приложения, что означает, что сервер будет отправлять короткий ответ о том, что он получил столько данных до сих пор, скажем, каждую секунду. Если клиент не получает suck ack, скажем, в течение 3 секунд, клиент знает, что соединение непригодно для использования, и может закрыть его. Кстати, это проще сделать с неблокирующими сокетами и функциями опроса, такими как select(2) или poll(2).

Редактировать 0:

Я думаю, что это было бы очень уместно здесь - "Конечная страница SO_LINGER, или: почему мой tcp ненадежен".

10.01.2013
  • Привет, спасибо за ваш ответ ... Итак, есть ли какой-либо метод, с помощью которого я могу узнать, что write () успешна или нет? Например, чтение сетевого стека ядра или получение подтверждения ядра. 11.01.2013
  • Нет, не совсем. Вы знаете только, что успешно отдали данные ядру для передачи. Единственный значимый способ узнать, что он был доставлен другой стороне, — это подтверждения на уровне приложения. 11.01.2013

  • 2

    Николай здесь прав, поведение, которое вы здесь испытываете, желательно, поскольку в основном вы можете продолжать передачу данных после отключения сети без какой-либо логики в вашем приложении. Если ваше приложение должно обнаруживать сбои дольше указанного времени, вам нужно добавить в свой протокол тактовый импульс. Это стандартный способ решения проблемы. Это также может позволить вам обнаружить ситуацию, когда с сетью все в порядке, приемник работает, но он заблокирован (из-за ошибки программного обеспечения).

    Сердцебиение может быть таким же простым, как упомянул Николай — отправка небольшого пакета каждые X секунд; если сервер не видит пакет в течение N*X секунд, соединение будет разорвано.

    11.01.2013
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..