我建立一个客户端和服务器程序,交换通过TCP数据和我无法从服务器发送一个ACK-确认返回给客户端时的动作是全成。我已经成功地从所述客户端发送与各种成员结构到服务器,然后服务器应通过发送确认整数该结构的ID返回给客户端作出响应。

在server.c我有这样的功能:

int sendACK(int socket, int ack_int){

    int com_result;
    int ACK = htonl(ack_int);

    printf("\n\tSending ACK with value: %i", ack_int);

    com_result = send(socket, &ACK, sizeof(ACK), 0);

    if (com_result == -1) {
        perror("\n\t[ERROR] Send ACK");
        return 0;
    }

    return 1;

}

此功能是由另一个功能在这样server.c称为:

int ACK = myStruct->ID;
sendACK(socket, ACK);

所以,如果我已经刚刚收到与ID的结构:如图2所示,输出将是:结果 的用值发送ACK:2

在client.c我收到这样的ACK:

int ACK = 0;
data_size  = sizeof(myStruct.ID);
com_result = read(client_socket, &ACK, data_size);
ACK = ntohl(ACK);

if (com_result == -1) {
    perror("\n\t[ERROR] Read");
} else {
    printf("\n\tRecieved %i of %i bytes", com_result, data_size);
    if (ACK != myStruct.ID) {
        printf("\n\t[ERROR] Invalid ACK (%i).", ACK);
    }
}

但ACK总是与值为1收到,所以从客户端的输出为:结果 的收到4 4字节,点击 ERROR]无效ACK(1)。

为什么没有整数收到具有值的 2 ,然后可如何解决这个问题?

有帮助吗?

解决方案

这是最有可能不是问题,但我相信,在你的下面的代码片段client.c二号线应该是的sizeof(ACK)。

int ACK = 0;
data_size  = sizeof(ACK); // was: sizeof(myStruct.ID);
com_result = read(client_socket, &ACK, data_size);
ACK = ntohl(ACK);

另外,根据您的数据流,是有可能,你实际上是正确阅读和ACK是来自你以前发送的数据包的响应?

其他提示

您应该从不发送这样的整体价值,就需要更加注重系列化。这可能失败,如果,例如,该sizeof (int)是从接收一个发送机,在这种情况下,你将读取的字节数不正确上不同。

这是更好地采取更多的关心和在同一时间序列化领域的一个字节。

为了调试它,可以使用 Wireshark的即可。执行的 Wireshark的并设置其选项收听所需的端口。你会看到什么实际的数据包中通过网络发送。这将允许您了解问题是否与服务器,客户端或两者兼而有之。

我无法找出什么毛病,你上面贴的代码。我建议失控的Wireshark,或另一插座跟踪程序,并在看电线上的位

我检查你的主要发送器/接收器代码是处理数据的正确的金额。

如果您的发送者发送20个字节后面四个字节的ACK,但是接收器试图读取ACK之前,只读取16,你可以有这类问题。

如果您要发送的可变长度的数据(即,与一个BYTECOUNT前缀)共同的混淆是否被实际发送的BYTECOUNT包括发送字节数所需要的附加字节...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top