как исправить сброс соединения по пиру в C - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь подключиться к клиенту к серверу, но он показывает сброс соединения по пиру

printf("Client Sends    **** |Version = %2u | Packet Type = %2u | Packet Length = %d | ClientID = %d | **** \n", SendHeader.ProtocolVersion, SendHeader.PacketType,SendHeader.PacketLength, SendHeader.ClientId);
int ResultReceived = 0;
while (1) { 
    if ((recv(sockfd, &RecvHeader, sizeof(RecvHeader), 0)) <= 0) {
        perror("recv invalid Bet");
        close(sockfd);
        exit(1);
    }
    printf("\n\nClient Receiv`enter code `es **** |Version = %2u | Packet Type = %2u | Packet Length = %d | ClientID = %d | **** `enter code here`\n",RecvHeader.ProtocolVersion`RecvHeader.PacketType,RecvHeader.PacketLength, RecvHeader.ClientId);
    switch (RecvHeader.PacketType) {
        case BEGASEP_ACCEPT:
            printf("\n");
            Begasep_AcceptMsg AcceptMessage;
            if ((recv(sockfd, &AcceptMessage, sizeof(AcceptMessage), 0)) <= 0) {
                perror("recv");
                exit(1);

Выход:

client: connecting to 127.0.0.1

Client Sends    **** |Version =  1 | Packet Type =  1 | Packet Length = 4 | ClientID = 0 |

**** recv invalid Bet: Connection reset by peer

1 Ответ

2 голосов
/ 28 марта 2019

Ошибка означает, что другая сторона закрыла соединение, пока вы писали больше данных. Можно ли с этим что-то сделать на стороне клиента, зависит от причины, по которой получатель закрыл соединение:

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

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

Два других случая - ошибки на вашей стороне: вы либо отправили слишком много данных, либо неправильно внедрили протокол. Примеры: Сервер ожидает «количество байтов», а затем N байтов данных. Вы отправляете «8», а затем 10 байтов. Через 8 байт другая сторона остановится.

Другие протоколы имеют команды «выход» или «пока», которые заставляют другую сторону закрывать соединение. Если после этого вы попытаетесь отправить больше данных, это не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...