【发布时间】:2024-07-27 12:20:01
【问题描述】:
我想在 C 中使用 TCP 套接字来实现协议,它的工作方式是这样的:
- 客户端连接到服务器并发送它想要的文件名 下载
- 服务器读取该值并检查它是否是有效的文件名(它是否存在于服务器上)+ 向客户端发送
ACCEPT或FAILURE状态 - 客户端读取该状态并准备自己下载 + 将
READY状态发送到服务器 - 服务器发送文件并关闭连接
服务器代码:
char response[128];
int bytes_read;
while ((bytes_read = read(info.socket, response, 128)) > 0) {}
if (valid_request(files, files_count, response)) {
write(info.socket, MC_ACCEPT, 4);
} else {
write(info.socket, MC_FAILURE, 4);
}
客户端代码:
int w_status = write(sck, requested_file, strlen(requested_file));
if (w_status < 0) {
fprintf(stderr, "Error writing to socket. Status: %d", w_status);
exit(1);
}
char status[4];
while ((resp = read(sck, status, 4)) > 0) {}
if (strcmp(status, MC_ACCEPT) == 0) {
printf("ACCEPTED!\n");
} else if (strcmp(status, MC_ACCEPT) == 0) {
printf("FAILURE\n");
} else {
printf("DONT KNOW\n");
}
close(sck);
问题是服务器在read() 部分冻结了自己。看起来客户端发送文件名并等待服务器响应(带有状态),但服务器在read() 冻结。
我是否以某种方式阻塞了 TCP 套接字?我的推理有什么问题?
【问题讨论】:
-
@Barmar 我的错误,我的真实代码中没有它
-
您是否尝试过抓包以查看消息是否正在发送到服务器?
-
@Barmar 当我第一次运行服务器时有趣的是,然后客户端挂起,但之后我用 CTRL + C 杀死客户端进程,服务器似乎得到了正确的消息,但直到客户端进程还活着
-
您的服务器代码除了等待请求什么都不做。您是否考虑过发送要求的文件?
-
@EJP 我在此处发布的此代码不完整。我稍后发送文件