程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++ 用setsockopt()來控制recv()與send()的超時,setsockoptrecv

VC++ 用setsockopt()來控制recv()與send()的超時,setsockoptrecv

編輯:C++入門知識

VC++ 用setsockopt()來控制recv()與send()的超時,setsockoptrecv


在send(),recv()過程中有時由於網絡狀況等原因,收發不能預期進行,而設置收發超時控制:

以下是來自於網上一篇文章中的摘錄,它是這樣寫的:

int nNetTimeout=1000;//1秒,
//設置發送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

有兩點注意就是:

1)recv ()的第四個參數需為MSG_WAITALL(設置MSG_DONTWAIT可以不用阻塞在建立連接後在等等接收數據),在阻塞模式下不等到指定數目的數據不會返回,除非超時時間到。還要注意的是只要設置了接收超時,在沒有MSG_WAITALL時也是有效的。說到底超時就是不讓你的程序老在那兒等,到一定時間進行一次返回而已。

2)即使等待超時時間值未到,但對方已經關閉了socket, 則此時recv()會立即返回,並收到多少數據返回多少數據。

    int rst;
    int nNetTimeout = nTimeOut;//1秒,    
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN  addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(wIpAddr);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port =htons(nPort);
    setsockopt(sockClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
    rst = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
    if (rst != 0)
    {
        return 0;
    }
    
    setsockopt(sockClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
    send(sockClient, "1", 3, 0);//最後一位 為0 是默認值  
    char recvbuf[4];
    memset(recvbuf, 0, 4);
    setsockopt(sockClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
    recv(sockClient, recvbuf, 100, 0);
    closesocket(sockClient);

    if (recvbuf[0] == 'C' && recvbuf[1] == 'D')
    {
        return 1;
    }
    else
    {
        return 0;
    }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved