Как я могу проверить если клиент, разъединенный через Winsock в C++?

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

Есть ли конфигурация, чтобы исправить это?

Да.

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

canvas = tk.Canvas(window, width=winW, height=winH, 
                   borderwidth=0, highlightthickness=0)

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

12
задан GEOCHET 26 March 2009 в 15:08
поделиться

3 ответа

Руководство по сетевому программированию Beej

если Вы называете recv в блокирующемся режиме, и он возвращается с 0-байтовым чтением, сокет разъединился, еще он ожидает байтов, которые будут получены.

Посмотрите в этом FAQ 2.12

пример от выбора на этой странице.

int nRet;

if(( nRet = select( 0, &fdread, NULL, NULL, NULL )) == SOCKET_ERROR )
{
    // Error condition
    // Check WSAGetLastError
}

if( nRet > 0 )
{
    // select() will return value 1 because i m using only one socket
    // At this point, it should be checked whether the
    // socket is part of a set.

    if( FD_ISSET( s, &fdread ))
    {
        // A read event has occurred on socket s
    }
}
13
ответ дан 2 December 2019 в 07:22
поделиться

Можно только сказать, 'разъединяется' ли сокет TCP путем попытки отправить данные. Это вызвано тем, что дизайн протокола таков, что он, как предполагается, допускает временные отключения электричества между коллегами. Так, если Вы соединяетесь от через R1 через R2 через R3 к B и отправляете данные некоторое время и затем прекращаете отправлять, Вы могли отключить R2-> R3 (например), и ни A, ни B не заметят (или уход). Если бы Вы затем включили R2-> R4 и R4-> R3 и затем попытались отправить данные между A и B затем, то вещи 'просто работали бы', и Вы никогда не знали бы. Если бы, однако, Вы пытались отправить данные, когда R2-> R3 был разъединен затем, Вы были бы (в конечном счете, после всех повторений уровня TCP) возвращают ошибку.

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

Если наличие Ваших коллег знает, когда соединения 'повреждаются', важно, затем или используйте сообщение 'ping' прикладного уровня, чтобы иногда отправить данные между коллегами или использовать активный TCP. Лично я пошел бы для сообщений ping...

Править: Конечно, все, что предполагает, что Вы хотите знать, можно ли все еще отправить данные по соединению, в конце концов, которое Вам ГОВОРЯТ, когда клиент больше не отправляет, потому что Ваши чтения возвратят 0 байтов и Вы ЗНАЕТЕ, когда они разъединяют отправлять сторону, потому что Ваши записи перестанут работать; Вы также ЗНАЕТЕ, когда Вы завершаете работу или отправления или recv стороны Вашего собственного конца соединения...

Я предполагаю, что должен был придерживаться начального ответа реакции пищеварительного тракта, "определяют разъединенный" ;)

6
ответ дан 2 December 2019 в 07:22
поделиться

Существует несколько различных путей, но наиболее распространенное должно проверить результат отправления или получить команду:

 nReadBytes = recv(sd, ReadBuffer, BufferSize, 0);
 if (nReadBytes == SOCKET_ERROR)
 {
     //error
 }
 nSendBytes = send(sd, WriteBuffer, BufferSize, 0);
 if (nSendBytes == SOCKET_ERROR)
 {
     //error
 }

Больше примеров (вместе с проверкой ошибок, обоими клиентами и серверами) здесь:

http://tangentsoft.net/wskfaq/examples/basics/

2
ответ дан 2 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: