linux和windows下用setsockopt設定SO_SNDTIMEO,SO_RCVTIMEO的引數的一點區別UDP的socket在某些情況:如對方關閉時,本地可能sendto不出去資料,然後recvfrom就會被阻塞,這時就需要設定這兩個引數的值提高程式質量。linux:structtimevaltimeout={3,0};//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(constchar*)&timeout,sizeof(timeout));intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,(constchar*)&timeout,sizeof(timeout));如果ret==0則為成功,-1為失敗,這時可以檢視errno來判斷失敗原因intrecvd=recv(sock_fd,buf,1024,0);if(recvd==-1&&errno==EAGAIN){printf("timeout\n");}windows:inttimeout=3000;//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));而solaris,則不支援。
linux和windows下用setsockopt設定SO_SNDTIMEO,SO_RCVTIMEO的引數的一點區別UDP的socket在某些情況:如對方關閉時,本地可能sendto不出去資料,然後recvfrom就會被阻塞,這時就需要設定這兩個引數的值提高程式質量。linux:structtimevaltimeout={3,0};//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(constchar*)&timeout,sizeof(timeout));intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,(constchar*)&timeout,sizeof(timeout));如果ret==0則為成功,-1為失敗,這時可以檢視errno來判斷失敗原因intrecvd=recv(sock_fd,buf,1024,0);if(recvd==-1&&errno==EAGAIN){printf("timeout\n");}windows:inttimeout=3000;//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));而solaris,則不支援。