Bạn có thể sử dụng hàm setsockopt để đặt thời gian chờ cho các hoạt động nhận:
SO_RCVTIMEO
Đặt giá trị thời gian chờ chỉ định lượng thời gian tối đa mà một hàm đầu vào đợi cho đến khi hoàn thành. Nó chấp nhận cấu trúc định thời gian với số giây và micro giây xác định giới hạn về thời gian chờ một thao tác nhập hoàn tất. Nếu một thao tác nhận đã bị chặn trong khoảng thời gian này mà không nhận được thêm dữ liệu, nó sẽ trả về với số lượng một phần hoặc lỗi được đặt thành [EAGAIN] hoặc [EWOVERBLOCK] nếu không có dữ liệu nào được nhận. Giá trị mặc định cho tùy chọn này là 0, điều này chỉ ra rằng thao tác nhận sẽ không hết thời gian. Tùy chọn này có cấu trúc thời gian. Lưu ý rằng không phải tất cả các triển khai đều cho phép thiết lập tùy chọn này.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Được biết trên Windows, điều này nên được thực hiện trước khi gọi bind
. Tôi đã xác minh bằng thử nghiệm rằng nó có thể được thực hiện trước hoặc sau bind
trên Linux và OS X.