powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как узнать жив ли SOCKET до передачи данных?
33 сообщений из 33, показаны все 2 страниц
Как узнать жив ли SOCKET до передачи данных?
    #32101044
_kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать жив ли SOCKET до передачи данных?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #32102301
Alexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понюхать его, если не завонялся - то жив!
А вообще нужно отслеживать его состоянии в процессе работы с ним - там есть куча всяких нотисов!
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #32102480
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть как жив? если сможеш сенд сделать с неотритцательным результатом - значт жив пока. Или тебя чужой сокет интересует?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #32262319
Tvorez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пошли ему контрольное сообщение, вроде: "Ты как там, жив?"; или любое другое, если он примит его нормально - жив, если нет - увы.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как узнать жив ли SOCKET до передачи данных?
    #34108586
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если чужой сокет? Есть какая нибудь возможность узнать жив ли он, не отправляя сообщение? Так как требуется это проверить до того как будут посланы данные.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34108838
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select'ом на write.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34109024
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WSAAsyncSelect (hListenSockTCP,GetConsoleHWND(),WM_ASYNC_CLIENTEVENT,FD_WRITE);

Так? И какое значение должен вернуть селект?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34109046
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду:

The Windows Sockets select function
int select (
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);


Ну, а по режимам, смотреть аналогичные функции
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34109094
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно пример этой функции...
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34109108
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajА можно пример этой функции...


Что нибудь типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct fdset fs;
struct tin\meval tv;

FD_ZERO(&fs);
FD_SET(&fs, hHandle);

tv.tv_sec= 0 ;
tv.tv_usec= 100 ;

int ret=select(hHandle+ 1 , NULL, &fs, NULL, &tv);
if (ret== 1 )
   //все будет хорошо :)

будет ждать 100мкс возможности записать в сокет.

Но лучше ставь на read, т.к. опыт под линухами с трубами показал, что при проверке на write может и зависнуть.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34109126
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо :)
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114309
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализовал проверку следующим образом :

Errors_sock = send(serv_sock, "", 0, 1);
if(Errors_sock == -1)
{
...
}
else
{
...
}

Работает нормально, в случае если serv_sock отваливается, программа завершается. У меня возник вопрос, будет ли такая проверка правильно или же искать какой нибудь другой вариант обработки?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114513
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajРаботает нормально, в случае если serv_sock отваливается, программа завершается. У меня возник вопрос, будет ли такая проверка правильно или же искать какой нибудь другой вариант обработки?

В принципе - можно. Примерно так я и поступаю, для определения наличия коннекта.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114587
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВ принципе - можно. Примерно так я и поступаю, для определения наличия коннекта.

Меня смущает, что отправляются сообщения на сервер, хоть они и пустые...
Я написал сервер, он эти сообщения не видет, а, например, если я буду так проверять другие работу сокетов на других серверах, будут ли обрабатыватся посылаемые мной сообщения?

Синтаксиз Errors_sock = send(serv_sock, "", 0, 1);

serv_sock - понятно
"" - пустое сообщение
0 - ноль посылаемых символов в сообщении
а вот с флагом 1 - не понятно, как по русски то понять, что он делает? Так как в документации написано, что если флаг установлен в 0, то функция аналогична системному вызову write, а если он не ноль, то ничего не сказано.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114648
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj AkhВ принципе - можно. Примерно так я и поступаю, для определения наличия коннекта.

Меня смущает, что отправляются сообщения на сервер, хоть они и пустые...

Честно сказать, ничего не понял. ;) На счет флага - 1 это нонсес. Почитай справку. В линуксе у send'а 5 флагов, которые можно совмещать операцией или. Возможно 1 - это MSG_DONTWAIT. Возможно нет (влом лезть в хеадеры).
Посмотри, что устанавливается в errno в случае ошибки. Делай от сюда выводы.

Линуксовая справка .

Если будут вопросы - задавай.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114709
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот выдрал из Winsock2.h

#define MSG_OOB 1
#define MSG_PEEK 2
#define MSG_DONTROUTE 4
#define MSG_MAXIOVLEN 16
#define MSG_PARTIAL 0x8000

Как я понял Линуксовым соответствуют только два флага... Чтож буду осмысливать информацию и пытатся применить ее к форточкам :) Спасибо за сведенья ;)
Думаю вопросы еще появятся.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114726
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как раз один созрел :

"Посылает внепотоковые данные, если сокет это поддерживает (как, например, сокеты типа SOCK_STREAM); протокол более низкого уровня также должен поддерживать внепотоковые данные."

Т.е. данные, которые не будут вносится в поток принимающего сокета?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114762
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajВот как раз один созрел :

"Посылает внепотоковые данные, если сокет это поддерживает (как, например, сокеты типа SOCK_STREAM); протокол более низкого уровня также должен поддерживать внепотоковые данные."

Т.е. данные, которые не будут вносится в поток принимающего сокета?

http://coldflame.by.ru/bgnet/bgnet/recvman.shtml
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114864
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял :) В случае, если в прослушиаеющем recv сокете не определен флаг MSG_OOB, то данные паета не будут приняты, но и код ошибкb -1 не будет отослан :)

Так что получается, что для проверки жив ли сокет, такая проверка подходит.

Akh спасибо за информацию :)
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34114982
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajТак что получается, что для проверки жив ли сокет, такая проверка подходит.

С такими общими моментами не заморачивался, так что тут стоит серьезений поразбираться.

Может стоти пробовать читать с сокета и проверять ошибки ECONNREFUSED или ENOTCONN?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115426
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал вот такую схему :

do
{
rec=recv(clientsock, str, sizeof(str), 0);
dl=rec;
if(rec>=0)
{
printf("Size : \n %d", dl, "\n");
printf("\nRecieved : \n");
for(i=0; i<dl; i++)
{
printf("%c", str );
}
printf("\n");
}
else
{
printf("%d", rec);
}
}
while("EXIT");

recv
возращает -1 , в случае если нет присылаемых данных... В общем в ходе эксперементов удалось установить, что recv не реагирует на
Errors_sock = send(serv_sock, "", 0, 1); и возращает -1 в любом случае.

Есть подозрение, что recv просто отбрасывает заведомо пустые сообщения, обрабатывая их как ошибку, т.е. -1 , но на стороне клиента соединение проходит нормально send не возращает -1, т.е. ошибку при передачи.

Блин, извините ща путанность изложения.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115498
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По всей видимости пустые сообщения - заглушка на стороне отправителя и данные не пересылаются. Это можно проверить сниффером.

Пробовал проверять на разрыв коннекта по ECONNREFUSED или ENOTCONN?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115524
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhПробовал проверять на разрыв коннекта по ECONNREFUSED или ENOTCONN?

Нет, не пробывал. А где есть описание данных функций?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115589
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj AkhПробовал проверять на разрыв коннекта по ECONNREFUSED или ENOTCONN?

Нет, не пробывал. А где есть описание данных функций?

Когда делаешь recv и результат -1, то в errno заносится данное значение.
Надо смотреть в описание recv
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115691
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал с проверкой и без... В errno в обоих случаях возвращает ноль .
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115703
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajПопробовал с проверкой и без... В errno в обоих случаях возвращает ноль .

При соединии и разрыве?
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34115910
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем у меня вот такая структура :

Код: plaintext
1.
2.
Server <-----> Proxy <------ Client
       1     1       1     M

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Errors_sock = send(serv_sock, "", 0, 1);
    if(Errors_sock == -1)
     {
         printf("Error SERVER Socket!!!!!!!!!!!!!!\n");
         system("PAUSE");
         break;
     }
        else
     {
        ...
     }

У сервера организован прием сообщений, через recv:

Код: plaintext
1.
2.
3.
4.
5.
  rec = recv(cli_disc, buf, sizeof(buf), 0);
  if(rec>0) 
     {
         ...
     }

Так, вот в случае, если прокся не передает данные, то recv возращает -1, в обратном случае длину сообщения.
Я проверил какая ошибка заносится в errno, с организацией проверки отправкой пустого сообщения, и без оной... В обоих случаях код ошибки был равен нулю. Т.е. как я понял ошибки как таковой не возникало.

В случае, если закрыть программу сервера, проверка на проксе при отправке пустого сообщения будет возращать -1, т.е. это можно использовать, как флаг, что у сервера, что то не в порядке.

Вот я и думаю, что наверное, такую проверку, жив ли сокет можно использовать :) (Надеюсь, объяснил понятно :) )

Хотя может, я что и напутал по неопытности.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116039
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное можно
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116165
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajЕсть какая нибудь возможность узнать жив ли он, не отправляя сообщение? Так как требуется это проверить до того как будут посланы данные.Ой, а он может помереть сразу после этой вашей проверки и до того как будут посланы данные. Зачем вам отдельная проверка ? Смотрите ра результат возвращаемый при попытке отправки данных.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116181
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone LepajЕсть какая нибудь возможность узнать жив ли он, не отправляя сообщение? Так как требуется это проверить до того как будут посланы данные.Ой, а он может помереть сразу после этой вашей проверки и до того как будут посланы данные. Зачем вам отдельная проверка ? Смотрите ра результат возвращаемый при попытке отправки данных.

Бывает нужна реакция на отвал сокета.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116299
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneОй, а он может помереть сразу после этой вашей проверки и до того как будут посланы данные. Зачем вам отдельная проверка ? Смотрите ра результат возвращаемый при попытке отправки данных.

Я не спорю, но Akh прав, тут как раз такая ситуация, нужно проверить не овалился ли сервер, если он отвалился, то не принимать соединения от клиентов. А если смотреть по отсылаемым данным, то клиент будет уверен, что отослал данные.

Если реализовывать такой вариант, то в случае неудачной отправки нужно как то известить клиента, ведь он уже отослал данные, что усложнит программу и потребует обработку клиентом сообщений присылаемой проксей.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116432
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если соединение с сервером порвалось, после получения данных от клиента?
А если внутренняя ошибка на прокси произойдет?
Клиент не может быть уверен, что данные, которые он отправил дошли до сервера, тем более, что они обработаны сервером.
...
Рейтинг: 0 / 0
Как узнать жив ли SOCKET до передачи данных?
    #34116499
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhА если соединение с сервером порвалось, после получения данных от клиента?
А если внутренняя ошибка на прокси произойдет?
Клиент не может быть уверен, что данные, которые он отправил дошли до сервера, тем более, что они обработаны сервером.

Конечно не может :D, но так хоть частично можно обезопаситься :) А вообще над этой задачей нужно думать. Вот например, сейчас надо будет сделать защиту от переполнения буфера :) Да и вообще может произойти, что угодно. Я только неделю с сетью и Си работаю :)
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как узнать жив ли SOCKET до передачи данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]