Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный. / 9 сообщений из 9, страница 1 из 1
30.01.2014, 19:02
    #38544128
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
пример кода 
//FILE - CNet.cpp

#include "CNet.h"

 CNet::CNet()
 {
	 WSADATA wd;

	 memset( &wd, 0, sizeof(wd) );

	 if( SUCCEEDED( WSAStartup(MAKEWORD(2,2), &wd )) ) 
	 {
		 m_bBadSocket        = false;
		 m_bBadAuthorization = false;
		 m_iLenMsg           = 0;
	 }

	 if( !m_bBadSocket )
		 StartingServer();
	 else 
		 WSACleanup();
 }

 void CNet::AbortServer()
 {
	 /*Message*/
	 closesocket(m_sListen);
	 WSACleanup();
 }

 void CNet::StartingServer()
 {
	 sockaddr_in SockServer;

	 memset( &SockServer, 0, sizeof(sockaddr_in) );

	 SockServer.sin_family      = AF_INET;
	 SockServer.sin_port        = htons(FTP_PORT);
	 SockServer.sin_addr.s_addr = htonl(INADDR_ANY);

	 m_sListen = socket( AF_INET, 
		                 SOCK_STREAM, IPPROTO_TCP );

	 if( FAILED( m_sListen ) ) 
		 m_bBadSocket = true;

	 if( FAILED( bind( m_sListen, reinterpret_cast<sockaddr*>(&SockServer), sizeof(sockaddr_in))) )
		 m_bBadSocket = true;

	 if( FAILED( listen( m_sListen , 1 )) )
		 m_bBadSocket = true;

	 if( m_bBadSocket )
		 AbortServer();	 

		for( ;; ) {
			m_sLink = accept( m_sListen, NULL, NULL );

			
		}
		
	 shutdown( m_sListen, 2 );
	 closesocket( m_sListen );
	 WSACleanup();
 }
 

//FILE - CNet.h

#include <WinSock.h>
#include "CEncode.h"

	using namespace std;

#pragma comment(lib,"ws2_32.lib")


#define USER_DEFAULT_LOGIN		"gera"
#define USER_DEFAULT_PASSWORD   "gera"

#define REQUEST_AUTHORIZATION   "PE_AUTO"                  /* Запрос на авторизацию  */
#define REQUEST_SUCCESS			"YS_AUTO"                  /* Авторизация успешна    */
#define REQUEST_FAILED          "YF_AUTO"				   /* Авторизация неуспешна  */
#define REQUEST_AUTH_ERROR      "FQ_USER"                  /* Отказано в доступе     */

#define HELLO_TRAVELING			"HI TRAVELING\n"	       /* Строка приветствия     */

#define FTP_PORT                21

class CNet : public CEncode
{

	SOCKET m_sLink;
	SOCKET m_sListen;

	bool   m_bBadSocket;
	bool   m_bBadAuthorization;

	int    m_iLenMsg;

	void StartingServer();
	void AbortServer();

	public:
		CNet();
};
...
Рейтинг: 0 / 0
30.01.2014, 19:04
    #38544131
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
gera3323, и Грамотно ли написан это код ?

что тут подкоректировать.
...
Рейтинг: 0 / 0
30.01.2014, 19:17
    #38544149
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
gera3323и Грамотно ли написан это код ?
Ну, от примера из MSDN никто особо грамотности не ожидает, не для того они пишутся...

По сабжу: если клиент отключился штатно, recv() сразу вернёт 0. Если нештатно - send()
вернёт ошибку при первой попытке что-то послать, recv() вернёт ошибку после срабатывания
механизма KEEP ALIVE если тот включён и настроен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.01.2014, 19:25
    #38544166
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
Dimitry Sibiryakov, спасибо сделал.
...
Рейтинг: 0 / 0
30.01.2014, 19:37
    #38544179
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
gera3323,

на recv не помешает задание разумного таймаута
...
Рейтинг: 0 / 0
30.01.2014, 19:49
    #38544190
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
Изопропилна recv не помешает задание разумного таймаута
Вот бы ещё WinSock его поддерживал...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.01.2014, 20:46
    #38544238
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
Dimitry SibiryakovВот бы ещё WinSock его поддерживал...
не так всё печально - setsockopt(,,SO_RCVTIMEO,,) для синхронного recv работает
...
Рейтинг: 0 / 0
30.01.2014, 21:00
    #38544246
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
Изопропилsetsockopt(,,SO_RCVTIMEO,,) для синхронного recv работает
О, действительно, в свежей доке сказано, что работает во вторых сокетах. А я-то всё поезда
под откос...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.01.2014, 22:03
    #38544284
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный.
на самом деле что Дима написал не совсем верно, потому что TCP это абстракция над нижними слоями сети, поэтому как оно там внутри будет себя вести - может быть по-разному.
появляться это будет как ошибки чтения и записи.
при больших keep alive физическое соединение может рваться и восстанавливаться несколько раз, а логическое - висеть и ждать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пишу свой сервер. Как узнать что клиент отключился от сервера ? Сервер одноклиентный. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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