题
我建立一个客户端和服务器程序,交换通过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包括发送字节数所需要的附加字节...