我想用C其中工程样的这种方式使用TCP套接字来实现协议:TCP套接字冻结服务器
- 客户端连接到服务器并发送文件名,它要 下载
- 服务器读取值,并检查它是否是有效的文件名(它存在于服务器上)+发送
ACCEPT
或FAILURE
状态,客户端 - 客户端读取状态,并准备自己下载+发送
READY
状态服务器 - 服务器发送文件并关闭连接
Server代码:
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
@Barmar当我第一次运行一个服务器,然后客户端和它挂起时,什么是有趣的,但之后,我用CTRL + C终止客户端进程,服务器似乎得到的消息恰到好处,但直到客户端进程还活着 –