如何修复C中对等体的连接重置

问题描述 投票:0回答:1

我正在尝试连接到客户端到服务器,但它显示由同行重置连接

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
c client-server
1个回答
2
投票

该错误意味着在您编写更多数据时,另一方已关闭连接。您是否可以在客户端执行某些操作取决于接收方关闭连接的原因:

  • 程序崩溃或重启
  • 它认为它有足够的数据
  • 你告诉它关闭连接然后继续使用它

因此,如果日志文件中存在任何错误,则第一步是查看远程计算机。

另外两种情况是您的错误:您要么发送太多数据,要么没有正确实施协议。例如:服务器需要“字节数”,然后是N个字节的数据。您发送“8”然后发送10个字节。在8个字节后,另一侧将停止。

其他协议具有“退出”或“再见”命令,这些命令会导致另一方关闭连接。如果您尝试在此之后发送更多数据,那将失败。

© www.soinside.com 2019 - 2024. All rights reserved.