在我的程序中,我正在使用timeval TCP/IP套接字程序的time.h結構,其中客戶端等待此結構值指定的超時值結構初始化如下套接字不等待預期的10秒
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
並按原樣設置套接字選項。由於recv()是一個阻塞呼叫,我把超時:
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)) ;
並使用recv()函數接收數據。因此,爲了驗證延遲是否好,我用了兩個變量開始&停止time_t類型的:
直到數據通過接收time_t start=clock();
BytesRcvd = recv(sock, CacheBuffer1, sizeof(CacheBuffer1), FLAG);
time_t stop=clock();
time_t difference=difftime(stop,start);
,從而按照定義我的期望是的recv()函數等待最多10秒插座。從服務器端我沒有發送任何東西。但是在計算差值後,我得到的值是10,但我沒有感覺到接收延遲10秒,但是在毫秒的範圍內,所以我認爲它只需要大約10 毫秒
什麼可能是問題?有什麼想法嗎?
[從評論更新]
我的插座是無阻塞的,這就是爲什麼我用setsocketopt()函數,我要等待10秒,即超時值;如果在10秒內沒有收到數據,我必須退出recv()函數...
什麼是全局'errno'設置爲?你的套接字是否被阻塞?如果是這樣,那就不會永遠等下去。 'fcntl'會設置阻塞選項。 10秒的意義是什麼? – Brian
我的套接字是非阻塞的,這就是爲什麼我使用setsocketopt()函數,我想等待10秒的超時值,即;如果在10秒內沒有收到數據,我必須退出recv()函數... – user3395801
您可以使用'fcntl'設置阻塞選項。不'setsocketopt'。 https://stackoverflow.com/a/1549344/2591612 – Brian