Câu hỏi ngắn
Cách đúng để xử lý sự kiện Ctrl-C được gửi qua Telnet ở phía máy chủ là gì?Ổ cắm POSIX: Cách phát hiện Ctrl-C được gửi qua Telnet?
Câu hỏi dài
Sau khi gọi recv() trên ổ cắm, tôi muốn xử lý một số trường hợp một cách thích hợp. Một trong số đó là trả về một mã lỗi nhất định khi nhận được Ctrl-C. Cách chính xác để phát hiện điều này là gì? Các công trình sau đây, nhưng nó chỉ có vẻ không đúng:
size_t recv_count;
static char ctrl_c[5] = {0xff, 0xf4, 0xff, 0xfd, 0x06};
recv_count = recv(socket, buffer, buffer_size, 0);
if (recv_count == sizeof(ctrl_c) &&
memcmp(buffer, ctrl_c, sizeof(ctrl_c) == 0)
{
return CTRL_C_RECEIVED;
}
Tôi tìm thấy một bình luận trên Ctrl-C trong một phụ lưu ý trong this UNIX Ổ cắm FAQ:
[...] (bằng cách này, out-of-band thường được sử dụng cho ctrl-C đó).
Như tôi đã hiểu, việc nhận dữ liệu ngoài băng được thực hiện bằng cách sử dụng recv() với một cờ nhất định làm thông số cuối cùng. Nhưng khi tôi chờ đợi dữ liệu bằng cách sử dụng recv() như tôi đã làm trong đoạn mã trên, tôi không thể đọc dữ liệu ngoài băng cùng một lúc. Ngoài ra, tôi nhận được một cái gì đó bằng cách sử dụng recv() mà không có cờ oob đó.
Ctrl-D được gửi bằng telnet dưới dạng ký tự^D (0x04) –