在send(),recv()過程當中有時因爲網絡情況等緣由,收發不能預期進行,而設置收發超時控制:
在Linux下須要注意的是時間的控制結構是struct timeval而並非某一整型數,如下是來自於網上一篇文章中的摘錄,它是這樣寫的:
int nNetTimeout=1000;//1秒,
//設置發送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
這樣作在Linux環境下是不會產生效果的,須以下定義:struct timeval timeout = {3,0};
//設置發送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
有兩點注意就是:
1)recv ()的第四個參數需爲MSG_WAITALL,在阻塞模式下不等到指定數目的數據不會返回,除非超時時間到。還要注意的是隻要設置了接收超時,在沒有MSG_WAITALL時也是有效的。說到底超時就是不讓你的程序老在那兒等,到必定時間進行一次返回而已。
2)即便等待超時時間值未到,但對方已經關閉了socket, 則此時recv()會當即返回,並收到多少數據返回多少數據。
struct timeval結構體在time.h中的定義爲: struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; 其中,tv_sec爲Epoch到建立struct timeval時的秒數,tv_usec爲微秒數,即秒後面的零頭。好比當前我寫博文時的tv_sec爲1244770435,tv_usec爲 442388,即當前時間距Epoch時間1244770435秒,442388微秒。