Проблема с закрытием розеток. Программа останавливается

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

Вот строки, которые, как мне кажется, вызывают проблему

int SendBinary(int *byte, int length)
{
    int bytes_sent;

    bytes_sent = send(connecting_socket, byte, length, 0);

    return bytes_sent;


    return 0;
}

void SendFile(FILE *fp, int file_size)
{
    int current_char = 0;

    do{
        current_char = fgetc(fp);

        if ( current_char == EOF )
            break;

        SendBinary(&current_char, sizeof(char));
    }
    while(current_char != EOF);

}

Есть идеи, что мне делать, чтобы предотвратить это? Пересмотрите весь исходный код на предмет дополнений к этому фрагменту.

Здесь не так много информации. Как сервер выходит? Если это segfault, использовали ли вы отладчик, чтобы определить, где возникает ошибка?

Tim Lesher 13.01.2009 17:58

Нет, это не segfault, просто завершается без сообщений.

Filip Ekberg 13.01.2009 18:00

Никогда не используйте sizeof (char). Он определен как 1, поэтому он только добавляет путаницы в код. Кроме того, ваш код, скорее всего, сломан, поскольку он считывает char в int, а затем передает указатель на этот int функции (send ()), ожидающей указателя на байты.

unwind 13.01.2009 18:09

send ожидает пустого *. И sizeof (char) зависит от системы. конечно, в данном случае его Unix, где он 1. НО это хорошая практика.

Filip Ekberg 13.01.2009 19:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, ваше приложение получает SIGPIPE во время записи / отправки и не игнорирует его? Попробуйте проигнорировать этот сигнал или установить для него бездействующий обработчик.

Как это? сигнал (SIGPIPE, SIG_IGN);

Filip Ekberg 13.01.2009 19:54

Работает как шарм. Как бы на самом деле справиться с SIGPIPE?

Filip Ekberg 13.01.2009 19:58

Почти каждая программа игнорирует SIGPIPE. Вы узнаете, что это произошло при сбое функции write () или send (), правильно проверив возвращенные коды ошибок.

robottobor 14.01.2009 01:45

Хороший способ обнаружить ошибки и сбои, связанные с подобными вещами, - это запустить strace в вашей программе. Я не могу сосчитать, сколько раз Strace спасал мне жизнь.

Steve Lazaridis 27.02.2009 04:54

Вы уверены, что клиент не отказал при получении данных с сервера?

  1. telnet на ваш сервер, чтобы увидеть что он отправляет в ответ

  2. Замените свой сервер на netcat, чтобы убедиться, что клиент вести себя правильно

  3. Понюхать трафик между сервером и клиент, использующий tcpdump или аналогичный инструмент

Клиент - это Chrome и IE, поскольку это веб-сервер. В случае с Chrome он должен вести себя хорошо, но с IE никогда не знаешь;)

Filip Ekberg 13.01.2009 19:55

Другие вопросы по теме