【发布时间】:2010-12-18 06:19:59
【问题描述】:
我正在构建一个客户端和一个通过 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 的结构,输出将是:
发送值为 2 的 ACK
在 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,所以客户端的输出是:
Recieved 4 of 4 bytes
错误] ACK (1) 无效。
为什么没有收到值为 2 的整数,我该如何解决这个问题?
【问题讨论】:
-
首先你需要缩小你的范围。要排除客户端使用 telnet 连接到您的服务器,排除服务器使用
netcat作为您的客户端连接到的服务器。