在send(),recv()過程中有時由于網(wǎng)絡(luò)狀況等原因,收發(fā)不能預(yù)期進行,而設(shè)置收發(fā)超時控制:
在Linux下需要注意的是時間的控制結(jié)構(gòu)是struct timeval而并不是某一整型數(shù),以下是來自于網(wǎng)上一篇文章中的摘錄,它是這樣寫的:
int nNetTimeout=1000;//1秒,
//設(shè)置發(fā)送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設(shè)置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
這樣做在Linux環(huán)境下是不會產(chǎn)生效果的,須如下定義:struct timeval timeout = {3,0};
//設(shè)置發(fā)送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//設(shè)置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
有兩點注意就是:
1)recv ()的第四個參數(shù)需為MSG_WAITALL,在阻塞模式下不等到指定數(shù)目的數(shù)據(jù)不會返回,除非超時時間到。還要注意的是只要設(shè)置了接收超時,在沒有MSG_WAITALL時也是有效的。說到底超時就是不讓你的程序老在那兒等,到一定時間進行一次返回而已。
2)即使等待超時時間值未到,但對方已經(jīng)關(guān)閉了socket, 則此時recv()會立即返回,并收到多少數(shù)據(jù)返回多少數(shù)據(jù)。
posted on 2010-03-31 15:22
老馬驛站 閱讀(1787)
評論(0) 編輯 收藏 引用 所屬分類:
c++