1. 程式人生 > >socket為send和recv設定超時時間

socket為send和recv設定超時時間

linux和windows下用setsockopt設定SO_SNDTIMEO,SO_RCVTIMEO的引數的一點區別  

UDP的socket在某些情況:如對方關閉時,本地可能sendto不出去資料,然後recvfrom就會被阻塞,這時就需要設定 這兩個引數的值提高程式質量。

linux:

    struct timeval timeout={3,0};//3s
    int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeout,sizeof(timeout));
    int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,(const char*)
&timeout,sizeof(timeout));


    如果ret==0 則為成功,-1為失敗,這時可以檢視errno來判斷失敗原因
    int recvd=recv(sock_fd,buf,1024,0);
    if(recvd==-1&&errno==EAGAIN)
   {
        printf("timeout\n");
   }


windows:
int timeout = 3000; //3s
   int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));

   int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));

而solaris,則不支援。