我想用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終止客戶端進程,服務器似乎得到的消息恰到好處,但直到客戶端進程還活着 –