Tôi đang làm việc trên hệ thống Linux (máy chủ Ubuntu 7.04 có hạt nhân 2.6.20).chọn trên ổ cắm UDP không kết thúc khi ổ cắm bị đóng - tôi đang làm gì sai?
Tôi có một chương trình có một chuỗi (thread1) đang chờ trên một lựa chọn cho một ổ cắm UDP để có thể đọc được. Tôi đang sử dụng lựa chọn (với ổ cắm của tôi như là readfd duy nhất và duy nhất exceptfd) thay vì chỉ gọi recvfrom vì tôi muốn một thời gian chờ.
Từ một chủ đề khác, tôi tắt máy và đóng ổ cắm. Nếu tôi làm điều này trong khi thread1 bị chặn trong một recvfrom, sau đó recvfrom sẽ chấm dứt ngay lập tức. Nếu tôi làm điều này trong khi thread1 bị chặn trong một lựa chọn với một thời gian chờ, sau đó chọn sẽ không chấm dứt ngay lập tức, nhưng cuối cùng sẽ hết thời gian.
Bất cứ ai có thể cho tôi biết lý do tại sao lựa chọn đó không thoát ngay sau khi đóng socket? Đó không phải là một ngoại lệ sao? Tôi có thể nhìn thấy nơi nó không thể đọc được (rõ ràng), nhưng nó đóng cửa, mà dường như được exeptional.
Đây là việc mở các ổ cắm (tất cả các lỗi xử lý loại bỏ để giữ cho mọi thứ đơn giản):
m_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in si_me;
memset((char *) &si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(m_sockfd, (struct sockaddr *)(&si_me), sizeof(si_me)) < 0)
{
// deal with error
}
Đây là tuyên bố chọn mà thread1 thực hiện:
struct timeval to;
to.tv_sec = timeout_ms/1000;// just the seconds portion
to.tv_usec = (timeout_ms%1000)*1000;// just the milliseconds
// converted to microseconds
// watch our one fd for readability or
// exceptions.
fd_set readfds, exceptfds;
FD_ZERO(&readfds);
FD_SET(m_sockfd, &readfds);
FD_ZERO(&exceptfds);
FD_SET(m_sockfd, &exceptfds);
int nsel = select(m_sockfd+1, &readfds, NULL, &exceptfds, &to);
UPDATE: Rõ ràng (như đã nêu dưới đây), đóng ổ cắm không phải là một điều kiện đặc biệt (từ quan điểm của lựa chọn). Tôi nghĩ điều tôi cần biết là: Tại sao? Và, đó là cố ý ?.
Tôi thực sự muốn hiểu suy nghĩ đằng sau hành vi được chọn này bởi vì nó có vẻ phản đối mong đợi của tôi. Vì vậy, tôi rõ ràng cần phải điều chỉnh suy nghĩ của tôi về cách ngăn xếp TCP hoạt động. Xin vui lòng giải thích cho tôi.
Đó sẽ là một giải pháp tốt. Có sự lựa chọn chờ đợi trên cả hai ổ cắm và đường ống, và các chủ đề khác sẽ ghi vào đường ống để gây ra sự lựa chọn để trở về. –
Điều đó sẽ hiệu quả và có thể sẽ là những gì tôi kết thúc. Tôi chỉ muốn tránh bất kỳ bộ phận chuyển động nào khác. Cảm ơn! –