Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kolya8920
8 / 8 / 4
Регистрация: 14.05.2010
Сообщений: 133
Завершенные тесты: 1
1

Функция send() работает некорректно после применения closesocket()

22.08.2017, 14:26. Просмотров 878. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Имеется простенький тестовый сервер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SOCKET s;
    SOCKET s1;
    SOCKET s2 = NULL;
    char buf[1024];
    int rc;
 
    s = tcp_server(hname, sname);               //создаем сокет
    s1 = accept(s, NULL, NULL);                         //ждем подключения
 
    for (;;)
    {
        rc = recv(s1, buf, sizeof(buf), 0);     //принимаем данные
 
        if (rc == 0)                            //проверка
            error_yes("Клиент отсоединился", true);
        else if (rc < 0)
            error_yes("Ошибка recv", true);
 
        Sleep(5000);                            //ждем
 
        rc = send(s1, buf, rc, 0);              //?????после closesocket на стороне клиента, 
                                                                        //должна вернуть ошибку
        if (rc <= 0)
            cerr << " ERROR!";
    }
Запускаю СЕРВЕР. Затем запускаю КЛИЕНТ, отправляю данные серверу и вызываю closesocket(s). После приема сервер ждет 5 секунд, за это время успевает выполниться closesocket(s) на стороне клиента. После задержки на СЕРВЕРЕ функция send() должна вернуть ошибку, но она все равно отправляет данные.
Почему так?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2017, 14:26
Ответы с готовыми решениями:

Некорректно работает функция
Функция Small_S должна находить короткое слово в строке str, а она почему-то выводит первое слово!...

Функция работает некорректно
#include &lt;iostream&gt; using namespace std; short fill(double*, short); const short size = 5; ...

Функция работает некорректно
написал функцию,возвращающий нажатую клавишу: char func2(){ if(_kbhit()){ char c;...

Некорректно работает функция Delete
Слепил прожку. Которая должна записать в файл информацию о стране. А потом функция Делит должна по...

Некорректно работает функция rand
в полном коде почему-то не работает корректно функция rand, вот пример: #include&lt;cstdlib&gt;...

6
quwy
Native x86
3340 / 2186 / 649
Регистрация: 13.02.2013
Сообщений: 7,240
22.08.2017, 14:45 2
Цитата Сообщение от kolya8920 Посмотреть сообщение
Почему так?
Потому что так устроен TCP-протокол. См. полузакрытые подключения.
0
kolya8920
8 / 8 / 4
Регистрация: 14.05.2010
Сообщений: 133
Завершенные тесты: 1
22.08.2017, 15:08  [ТС] 3
Хорошо, но если я отправляю данные серверу, а затем просто закрываю приложение тот же send возвращает ошибку. Разве так не должно быть и при использовании closesocket?
0
quwy
Native x86
3340 / 2186 / 649
Регистрация: 13.02.2013
Сообщений: 7,240
22.08.2017, 15:40 4
Цитата Сообщение от kolya8920 Посмотреть сообщение
Разве так не должно быть и при использовании closesocket?
См. функцию shutdown.
application should use shutdown to close connection before calling closesocket
0
kolya8920
8 / 8 / 4
Регистрация: 14.05.2010
Сообщений: 133
Завершенные тесты: 1
22.08.2017, 15:48  [ТС] 5
Цитата Сообщение от quwy Посмотреть сообщение
application should use shutdown to close connection before calling closesocket
Вопрос-то не в том каким образом правильно разрывать соединение, это я уже читал.
Вопрос в том почему closesocket() действует не так же как простое закрытие приложения.
Вопрос этот родился в результате изучения литературы, в которой приведен этот пример и говориться что при использовании closesocket() со стороны клиента, send() со стороны сервера должен давать ошибку.

Вот и думается мне, все ли здесь правильно...
0
quwy
Native x86
3340 / 2186 / 649
Регистрация: 13.02.2013
Сообщений: 7,240
22.08.2017, 16:03 6
Лучший ответ Сообщение было отмечено kolya8920 как решение

Решение

Цитата Сообщение от kolya8920 Посмотреть сообщение
Вопрос в том почему closesocket() действует не так же как простое закрытие приложения.
По той же причине, по которой CloseHandle(ProcessHandle) не завершает процесс. Дескриптор -- это локальное отображение объекта ОС. closesocket и CloseHandle закрывает дескриптор, но сам объект вполне может жить и дальше, если у него есть такой потенциал. В вашем случае вызов closesocket на клиенте не уничтожает объект ОС на сервере. А вот shutdown(s1, SD_BOTH) однозначно дает удаленной стороне понять, что разговор окончен.
1
kolya8920
8 / 8 / 4
Регистрация: 14.05.2010
Сообщений: 133
Завершенные тесты: 1
22.08.2017, 16:08  [ТС] 7
Цитата Сообщение от quwy Посмотреть сообщение
По той же причине, по которой CloseHandle(ProcessHandle) не завершает процесс. Дескриптор -- это локальное отображение объекта ОС. closesocket и CloseHandle закрывает дескриптор, но сам объект вполне может жить и дальше, если у него есть такой потенциал. В вашем случае вызов closesocket на клиенте не уничтожает объект ОС на сервере.
ОК - честно говоря я так и думал. Просто нужно было авторитетное мнение.

Цитата Сообщение от quwy Посмотреть сообщение
А вот shutdown(s1, SD_BOTH) однозначно дает серверу понять, что разговор окончен.
Поведение тоже самое, что и при closesocket(), ошибку выдает только в функции recv(), send() как отправляла данные так и отправляет.
0
Миниатюры
Функция send() работает некорректно после применения closesocket()  
22.08.2017, 16:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2017, 16:08

Некорректно работает функция проверки на численность
Фрагмент кода: //... bool is_number() { //* while(cin.fail()) { cin.clear(); cin.sync();...

Некорректно работает функция добавления, указать ошибку
Здравствуйте, в моей программе некорректно работает добавление элемента, функция addBook. Также...

Некорректно работает функция рандомайз при заполнении массива
Задача - внести случайные числа в динамический массив. Проблема - почему-то при первом запуске...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru