Как определить, когда пользователь отключается от сети?

Возможный дубликат:
Определить, когда сетевой кабель отключен

Мне нужна помощь, чтобы проверить, не отключился ли кто-нибудь. На данный момент мой код говорит, что кто-то отключается каждый раз, когда я к нему подключаюсь. Я пытался использовать send (), чтобы проверить, все ли они «живы», но я не уверен, правильно ли я это сделал.

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

#include <iostream>
#include <WinSock2.h>

using namespace std;

#pragma region shittyvars

int countcons = 0, connections[100];
char *dead = new char;
int error;
WSAData netinfo;
int mySocket;
HANDLE acceptth, discth;

#pragma endregion

void AcceptThread( int* a)
{
int clientSocket;
while ( (clientSocket = accept(mySocket,0,0))!=SOCKET_ERROR)
connections[countcons++]=clientSocket;
}
void DissconectThread(int*b)
{
for(;;)
for(int i=0;i<countcons;i++)
{
error = send(connections[i],dead,4,0);
error = WSAGetLastError();
if(error != 0 )
{
closesocket(connections[i]);
for(int j=i+1 ; j<countcons ;j++)
connections[j-1]=connections[j];
countcons--;
cout<<"\nSomebody disconnected\n";
}
}
}

int main() {
#pragma region InitConnection
error = WSAStartup(MAKEWORD(2,2), &netinfo);

if (error == SOCKET_ERROR) {
cout << "Error:Starting socket failed";
return 1;
}

mySocket = socket(AF_INET, SOCK_STREAM, 0);

if (mySocket == SOCKET_ERROR) {
cout << "Error:Socket failed to initialize!";
return 1;
}
cout << "Works!";

struct sockaddr_in server; // network socket struct

server.sin_family = AF_INET;
server.sin_port = htons(7654);
server.sin_addr.s_addr = INADDR_ANY; // Let's us accept any connection

error = bind(mySocket, (sockaddr*) &server, sizeof(server));

if (error == SOCKET_ERROR) {
cout << "Error:Failed to bind socket";
return 1;
}

error = listen(mySocket, 100);

if (error == SOCKET_ERROR) {
cout << "Error:The socket is deaf";
return 1;
}

#pragma endregion

acceptth = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) AcceptThread,
&server, 0, (LPDWORD) &acceptth);
discth = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) DissconectThread,
&server, 0, (LPDWORD) &discth);
getchar();
closesocket(mySocket);
WSACleanup();
getchar();
return 0;
}

Как мне решить эту проблему?

0

Решение

Проверьте ошибку, которую вы получаете, когда send не удается … это может указать вам в правильном направлении (используйте WSAGetLastError() на винде). Кстати, твой DissconectThread будет просто вращаться и жевать процессор до тех пор, пока не будет установлено соединение, затем он заклинит данные до тех пор, пока не заблокирует одно соединение с полным буфером отправки … вероятно, не то, что вы предполагали.

0

Другие решения

Вам необходимо проверить возвращаемые значения read() а также write() звонки на ваши розетки (то же самое для recv() а также send()).

  • За грациозное завершение соединения на другой стороне вы получите 0 от read(),
  • За резкие отключения вы получите -1 от write() а также WSAECONNRESET от WSAGetLastError().
  • Проверьте все другие коды ошибок при получении -1 от send() а также recv(), игнорировать такие вещи, как WSAEINTRзакройте розетку на всех остальных.

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector