Setsockopt işlevini alma işlemlerinde bir zaman aşımı ayarlamak için kullanabilirsiniz :
SO_RCVTIMEO
Bir giriş işlevinin tamamlanana kadar bekleyeceği maksimum süreyi belirten zaman aşımı değerini ayarlar. Bir giriş işleminin tamamlanması için ne kadar bekleneceği ile ilgili limiti belirten saniye ve mikrosaniye sayısı ile bir zamanlama yapısını kabul eder. Bir alım işlemi ek veri almadan bu kadar süre bloke olmuşsa, veri alınmazsa kısmi sayım veya hata no [EAGAIN] veya [EWOULDBLOCK] olarak ayarlanarak geri dönecektir. Bu seçenek için varsayılan sıfırdır ve bu, bir alma işleminin zaman aşımına uğramayacağını belirtir. Bu seçenek zamana dayalı bir yapı alır. Tüm uygulamaların bu seçeneğin ayarlanmasına izin vermediğini unutmayın.
// 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);
Bildirildiğine göre Windows'ta bu, aramadan önce yapılmalıdır bind
. bind
Linux ve OS X'te önce veya sonra yapılabileceğini deneyle doğruladım .