<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JUST DO IT ~

    我只想當(dāng)個(gè)程序員

    遇到一個(gè)tcp socket問題。

     

     

      SetBlockMode(false);  // NONBLOCK mode      
     e = connect(m_socket, (struct sockaddr*)&addr, sizeof (addr));  
     if (e<0)       {      
     e = GET_LAST_SOCK_ERROR();  printf(" socket error code = %d \n",e);       
     if ((e==EWOULDBLOCK||e==EINPROGRESS || e == WSAEWOULDBLOCK ) && CheckSendAvailable(waitms)>0)    
     {             e = 0; // 表示連接成功      
      }  
    else   {  
               e = -1; // 表示連接失敗,或者在等待的時(shí)間之內(nèi)連接失敗          }
     
    我臨時(shí)修改。
             if ((e==EWOULDBLOCK||e==EINPROGRESS || e == WSAEWOULDBLOCK ) && CheckSendAvailable(waitms)>0)
    
     
    WSAEWOULDBLOCK  = 10037 
     
     
     
    問題找到了。
    切換到項(xiàng)目配置。平臺(tái)工具集---->vs2008   連接win sdk 6的庫
    切換到項(xiàng)目配置。平臺(tái)工具集---->vs2012 連接win  sdk  8 的庫
    有區(qū)別。
     
     

    E6~A%]$`JD$GI9K]TY[MO~Q

     

    正在生成代碼...
    1>  Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
    1> 
    1>  Copyright (C) Microsoft Corporation.  All rights reserved.
    1> 
    1> 
    1> 
    1>  正在搜索庫
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ws2_32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbc32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbccp32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\kernel32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\user32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\gdi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\winspool.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\comdlg32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\advapi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\shell32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ole32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\oleaut32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\uuid.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\libcpmtd.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ws2_32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbc32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbccp32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\kernel32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\user32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\gdi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\winspool.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\comdlg32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\advapi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\shell32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ole32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\oleaut32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\uuid.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
    1>      正在搜索 c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\libcpmtd.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ws2_32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbc32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\odbccp32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\kernel32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\user32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\gdi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\winspool.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\comdlg32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\advapi32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\shell32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\ole32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\oleaut32.lib:
    1>      正在搜索 C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\uuid.lib:
    1> 
    1>  已完成庫搜索
    1>  Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
    1> 
    1>  Copyright (C) Microsoft Corporation.  All rights reserved.
    1> 
    1> 
    1>  MDUSJS.vcxproj -> D:\dev\cmd3\cmdsiimdsi\MDUSJS2012\.\Debug\MDUSJS.exe
    ========== 生成: 成功 1 個(gè),失敗 0 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========

     

    平臺(tái)工具 連接的庫不一樣。

     

    Q__${K)0%R54TA9X8E8EUQJ

     


    >  正在生成代碼...
    1>dbf.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/SAFESEH”規(guī)范)
    1> 
    1>  正在搜索庫
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbc32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbccp32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\gdi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\winspool.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comdlg32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\advapi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ole32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\oleaut32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\uuid.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\LIBCMTD.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcpmtd.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbc32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbccp32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\gdi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\winspool.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comdlg32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\advapi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ole32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\oleaut32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\uuid.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\LIBCMTD.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcpmtd.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbc32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbccp32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\gdi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\winspool.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comdlg32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\advapi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ole32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\oleaut32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\uuid.lib:
    1> 
    1>  已完成庫搜索
    1> 
    1>  正在搜索庫
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbc32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbccp32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\gdi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\winspool.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comdlg32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\advapi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ole32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\oleaut32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\uuid.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\LIBCMTD.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib:
    1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcpmtd.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbc32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\odbccp32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\gdi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\winspool.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comdlg32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\advapi32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ole32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\oleaut32.lib:
    1>      正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\uuid.lib:
    1> 
    1>  已完成庫搜索
    1>  MDUSJS.vcxproj -> D:\dev\cmd3\cmdsiimdsi\MDUSJS2012\.\Debug\MDUSJS.exe
    ========== 生成: 成功 1 個(gè),失敗 0 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========

     

     

     

     

     

     

     
     
     

    參考:

    ms connect

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625(v=vs.85).aspx

     

    ioctlsocket function 控制柱塞非柱塞

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573(v=vs.85).aspx

     

    TCP/IP編程基礎(chǔ)——超時(shí)、多路復(fù)用、非阻塞

     

     

    http://blog.csdn.net/s3olo/article/details/8014872

     

     

     

    http://developerweb.net/viewtopic.php?id=7246

     

     

    代碼 windows  tcp 通過select方式實(shí)現(xiàn) connect non block

    http://bbs.csdn.net/topics/10426810

     

     

     

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

    Windows Sockets Error Codes

     

    ***************

    測(cè)試模擬工具發(fā)送大數(shù)據(jù)量消息時(shí),發(fā)現(xiàn)時(shí)而發(fā)送成功,時(shí)而失敗。追蹤代碼發(fā)現(xiàn),拋出的是一個(gè)錯(cuò)誤碼為10035的socket錯(cuò)誤。上網(wǎng)查資料發(fā)現(xiàn)這個(gè)錯(cuò)誤碼描述是Service temporarily unavailable.也就是說有可能send的時(shí)候遇到socket緩沖區(qū)滿,無法寫入,引起發(fā)送失敗。

      如果是這樣的話,那么這就是一個(gè)常規(guī)的異常情況,需要對(duì)它進(jìn)行處理,而不是異常退出。

      最后代碼改成這個(gè)樣子,send然后分析返回結(jié)果,如果錯(cuò)誤,且錯(cuò)誤碼為10035,那么就重發(fā),直到發(fā)成功時(shí),break。

      目前尚不知道,這樣改的副作用有沒有,反正現(xiàn)在問題暫時(shí)解決鳥

    ***********************************

     

    Winsock connect函數(shù)返回錯(cuò)誤,使用WSAGetLastError得到10035,10037,是什么原因
    MSDN注釋:
    WSAEWOULDBLOCK
    10035
    Resource temporarily unavailable.
    This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
    WSAEALREADY
    10037
    Operation already in progress.
    An operation was attempted on a nonblocking socket with an operation already in progress—that is, calling connect a second time on a nonblocking socket that is already connecting, or canceling an asynchronous request (WSAAsyncGetXbyY) that has already been canceled or completed.
    網(wǎng)絡(luò)翻譯:
    10035—WSAEWOULDBLOCK
    資源暫時(shí)不可用。對(duì)非鎖定套接字來說,如果請(qǐng)求操作不能立即執(zhí)行的話,通常會(huì)返回這個(gè)錯(cuò)誤。比如說,在一個(gè)非暫停套接字上調(diào)用 connect,就會(huì)返回這個(gè)錯(cuò)誤。因?yàn)檫B接請(qǐng)求不能立即執(zhí)行。
    10037—WSAEALREADY
    操作已完成。一般來說,在非鎖定套接字上嘗試已處于進(jìn)程中的操作時(shí),會(huì)產(chǎn)生這個(gè)錯(cuò)誤。比如,在一個(gè)已處于連接進(jìn)程的非鎖定套接字上,再一次調(diào)用 connect 或 WSAConnect。另外,服務(wù)提供者處于執(zhí)行回調(diào)函數(shù)(針對(duì)支持回調(diào)例程的 Winsock函數(shù))的進(jìn)程中時(shí),也會(huì)出現(xiàn)這個(gè)錯(cuò)誤。
    我描述下問題:使用socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);創(chuàng)建一個(gè)TCP/IP套接字,然后創(chuàng)建一個(gè)線程,不停地用connect函數(shù)進(jìn)行鏈接,直到鏈接成功,才退出線程,問題來了,connect函數(shù)它有時(shí)候返回成功,有時(shí)候又返回錯(cuò)誤,用WSAGetLastError得到享受10035, 10037這兩種錯(cuò)誤值,我將錯(cuò)誤值打印出來,結(jié)果是:10035,10035,10037,10037,10037,10037,10037.......,10037。

    ****************************************************************

     

     

     

     

    WSADATA wsd;
    SOCKET cClient;
    int ret;
    struct sockaddr_in server;
    hostent *host=NULL;
    if(WSAStartup(MAKEWORD(2,0),&wsd)){return 0;}
    cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(cClient==INVALID_SOCKET){return 0;}
    //set Recv and Send time out
    int TimeOut=6000; //設(shè)置發(fā)送超時(shí)6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }
    TimeOut=6000;//設(shè)置接收超時(shí)6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }
    //設(shè)置非阻塞方式連接
    unsigned long ul = 1;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)return 0;
    //連接
    server.sin_family = AF_INET;
    server.sin_port = htons(25);
    server.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);
    if(server.sin_addr.s_addr == INADDR_NONE){return 0;}
    connect(cClient,(const struct sockaddr *)&server,sizeof(server));
    //select 模型,即設(shè)置超時(shí)
    struct timeval timeout ;
    fd_set r;
    FD_ZERO(&r);
    FD_SET(cClient, &r);
    timeout.tv_sec = 15; //連接超時(shí)15秒
    timeout.tv_usec =0;
    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(cClient);
    return 0;
    }
    //一般非鎖定模式套接比較難控制,可以根據(jù)實(shí)際情況考慮 再設(shè)回阻塞模式
    unsigned long ul1= 0 ;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
    if(ret==SOCKET_ERROR){
    ::closesocket (cClient);
    return 0;
    }

     

     

     

    //設(shè)置非阻塞方式連接
    unsigned long ul = 1;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)return 0;
    //連接
    server.sin_family = AF_INET;
    server.sin_port = htons(25);
    server.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);
    if(server.sin_addr.s_addr == INADDR_NONE){return 0;}
    connect(cClient,(const struct sockaddr *)&server,sizeof(server));
    //select 模型,即設(shè)置超時(shí)
    struct timeval timeout ;
    fd_set r;
    FD_ZERO(&r);
    FD_SET(cClient, &r);
    timeout.tv_sec = 15; //連接超時(shí)15秒
    timeout.tv_usec =0;
    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(cClient);
    return 0;
    }
    //一般非鎖定模式套接比較難控制,可以根據(jù)實(shí)際情況考慮 再設(shè)回阻塞模式
    unsigned long ul1= 0 ;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
    if(ret==SOCKET_ERROR){
    ::closesocket (cClient);
    return 0;
    }

     

    ------------------------------------------

     

     

    // Socket中如何設(shè)置連接超時(shí)
    // AntGhazi/2001.12.14 主頁:antghazi.yeah.net
    /*
    把CSDN與中文yahoo翻了底朝天, 也沒找到如何設(shè)置socket的連接超時(shí)的滿意方法, 問此問題的兄弟已有一大堆,
    這里偶就講一下win下如何設(shè)置socket的connect超時(shí). 設(shè)置connect的超時(shí)很簡(jiǎn)單, CSDN上也有人提到過使用select,
    但卻沒有一個(gè)令人滿意與完整的答案. 偶所講的也正是select函數(shù), 此函數(shù)集成在winsock1.1中, 簡(jiǎn)單點(diǎn)講,"作用使
    那些想避免在套接字調(diào)用過程中被鎖定的應(yīng)用程序, 采取一種有序的方式, 同時(shí)對(duì)多個(gè)套接字進(jìn)行管理"
    (<<Windows網(wǎng)絡(luò)編程技術(shù)>>原話). 使用方法與解釋請(qǐng)見《Windows網(wǎng)絡(luò)編程技術(shù)》.
    在使用此函數(shù)前, 需先將socket設(shè)置為非鎖定模式, 這樣, 在connect時(shí),才會(huì)立馬跳過,
    同時(shí), 通常也會(huì)產(chǎn)生一個(gè)WSAEWOULDBLOCK錯(cuò)誤,這個(gè)錯(cuò)誤沒關(guān)系. 再執(zhí)行select則是真正的超時(shí).
    */
    WSADATA wsd;
    SOCKET cClient;
    int ret;
    struct sockaddr_in server;
    hostent *host=NULL;
    if(WSAStartup(MAKEWORD(2,0),&wsd))
    {
    return 0;
    }
    cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(cClient==INVALID_SOCKET)
    {
    return 0;
    }
    //set Recv and Send time out
    int TimeOut=6000; //設(shè)置發(fā)送超時(shí)6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
    TimeOut=6000;//設(shè)置接收超時(shí)6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
    //設(shè)置非阻塞方式連接
    unsigned long ul = 1;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)return 0;
    //連接
    server.sin_family = AF_INET;
    server.sin_port = htons(25);
    server.sin_addr.s_addr = inet_addr((LPCSTR)pSmtp);
    if(server.sin_addr.s_addr == INADDR_NONE)
    {
    return 0;
    }
    connect(cClient,(const struct sockaddr *)&server,sizeof(server));
    //select 模型,即設(shè)置超時(shí)
    struct timeval timeout ;
    fd_set r;
    FD_ZERO(&r);
    FD_SET(cClient, &r);
    timeout.tv_sec = 15; //連接超時(shí)15秒
    timeout.tv_usec = 0;
    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(cClient);
    return 0;
    }
    //一般非鎖定模式套接比較難控制,可以根據(jù)實(shí)際情況考慮 再設(shè)回阻塞模式
    unsigned long ul1= 0 ;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
    if(ret==SOCKET_ERROR)
    {
    ::closesocket (cClient);
    return 0;
    }
    /////////////////////////////////////////////////////////////////
    以前我從csdn上找到的,注意如果調(diào)用connect返回SOCKET_ERROR,那么你要調(diào)用 WSAGetLastError(),看錯(cuò)誤是不是WSAEWOULDBLOCK,如果是,則忽略,否則是真的出錯(cuò)了。

     

     

     

    -------------------------------------------------------------

     

     

    這個(gè)應(yīng)該是可以用的,因?yàn)槲矣眠^,我的代碼是這樣的,供你參考
    LPHOSTENT ScanIPAddr(DWORD dwIP)
    {
    SOCKET sock = INVALID_SOCKET;
    LPHOSTENT lphost = NULL;
    SOCKADDR_IN server;
    u_long ul = 1;
    struct timeval timeout ;
    fd_set r;
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = _nPort;
    server.sin_addr.s_addr = htonl((u_long)dwIP);
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET)
    return NULL;
    //設(shè)置非阻塞方式連接
    if(ioctlsocket(sock, FIONBIO, (u_long*)&ul)==SOCKET_ERROR)
    return NULL;
    if(0 != connect(sock, (SOCKADDR*)&server, sizeof(server)))
    {
    if(WSAGetLastError() != WSAEWOULDBLOCK)
    {
    closesocket(sock);
    return NULL;
    }
    }
    //select 模型,即設(shè)置超時(shí)
    FD_ZERO(&r);
    FD_SET(sock, &r);
    timeout.tv_sec = 0; //連接超時(shí)0秒
    timeout.tv_usec = 700;
    if(select(0, 0, &r, 0, &timeout) <= 0)
    {
    closesocket(sock);
    return NULL;
    }
    lphost = gethostbyaddr((const char *)&(server.sin_addr), 4, AF_INET);
    closesocket(sock);
    return lphost;
    }

     

     

     

    -----------------------------------------------------------------------------

     

     

     

    下面是我的實(shí)現(xiàn)代碼:
    char sBuf[2048];
        int i;
    int iSRTimeOut = 6000;
        u_long arg=1;
        rc4_key key;
        int r;
        struct sockaddr_in sockaddr; 
        sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if (sock==INVALID_SOCKET)
    {
            r=WSAGetLastError();
        closesocket(sock);
        sprintf(sBuf,"Winsock Error:%d",r);
        return Error(_T(sBuf));
    }
    //設(shè)置接收超時(shí)6000毫秒
        if(setsockopt(sock,IPPROTO_TCP,SO_RCVTIMEO,(const char FAR*)&iSRTimeOut,sizeof(int))==SOCKET_ERROR)
    {
    r=WSAGetLastError();
    closesocket(sock);
    sprintf(sBuf,"Winsock Error:%d",r);
    //return Error(_T(sBuf));
    }
    //設(shè)置發(fā)送超時(shí)6000毫秒
        if(setsockopt(sock,IPPROTO_TCP,SO_SNDTIMEO,(const char FAR*)&iSRTimeOut,sizeof(int))==SOCKET_ERROR)
        {
    r=WSAGetLastError();
    closesocket(sock);
    sprintf(sBuf,"Winsock Error:%d",r);
    //return Error(_T(sBuf));
    }
    //設(shè)置非阻塞連接方式
    unsigned long ul = 1;
        r = ::ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
        if(r==SOCKET_ERROR)
    {
    r=WSAGetLastError();
    closesocket(sock);
    sprintf(sBuf,"Winsock Error:%d",r);
    // return Error(_T(sBuf));
    }
    //進(jìn)行連接操作
        switch (m_ProxyType)
        {
    case 0:
           sockaddr.sin_addr.s_addr=inet_addr(m_SvrAddr);
       sockaddr.sin_port=htons((unsigned short)m_SvrPort);
       break;
        default:
           sockaddr.sin_addr.s_addr=inet_addr(m_ProxyAddr);
       sockaddr.sin_port=htons((unsigned short)m_ProxyPort);
       break;
        }
        sockaddr.sin_family=AF_INET;
        memset(sockaddr.sin_zero,0,8);
       int iReturn;
        connect(sock,(struct sockaddr*)&sockaddr,sizeof(struct sockaddr_in));
    iReturn = ConnectedReady(sock);// 連接延時(shí)
    if(iReturn == 0)
    {
    return Error(_T("Connect TimeOut!"));
    }
    if(iReturn >1)
    {
    sprintf(sBuf,"Winsock Error:%d",iReturn);
    return Error(_T(sBuf));
    }
    //設(shè)置回阻塞模式
    unsigned long ul1= 0 ;
        r = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul1);
        if(r==SOCKET_ERROR)
    {
    r=WSAGetLastError();
    closesocket (sock);
    sprintf(sBuf,"Winsock Error:%d",r);
    return Error(_T(sBuf));
    }
    說明:進(jìn)行setsockopt、設(shè)置非阻塞模式、一直到最后設(shè)置回阻塞模式,都有錯(cuò)誤碼返回!
    功能描述:本來我的程序就是要實(shí)現(xiàn):自己定義一個(gè)timeout值,在網(wǎng)絡(luò)不通或阻塞時(shí),客戶端調(diào)用connect,最長(zhǎng)等待timeout秒。
    msn:himming@hotmail.com

     

    ---------------------------------------------------------------------

    http://www.cnblogs.com/BloodAndBone/archive/2012/05/22/2513338.html

     

     

    windows下設(shè)置socket的connect超時(shí)

    變相的實(shí)現(xiàn)connect的超時(shí),我要講的就是這個(gè)方法,原理上是這樣的:
    1.建立socket
    2.將該socket設(shè)置為非阻塞模式
    3.調(diào)用connect()
    4.使用select()檢查該socket描述符是否可寫(注意,是可寫)
    5.根據(jù)select()返回的結(jié)果判斷connect()結(jié)果
    6.將socket設(shè)置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過一般情況下都是用阻塞模式的,這樣也容易管理)

    復(fù)制代碼

    // widonws: 默認(rèn)設(shè)置socket TCP client connect為阻塞模式
    void TcpConnect(char* strIP, UINT nPort)
    {
        struct sockaddr_in serverAddress;
        SOCKET hSocket = NULL;
    
        hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if( hSocket==INVALID_SOCKET)
        {
            return;
        }
    
        memset(&serverAddress, 0, sizeof(serverAddress));     
        serverAddress.sin_family      = AF_INET;
        serverAddress.sin_addr.s_addr = inet_addr(strIP);   
        serverAddress.sin_port        = htons((short)nPort);      
        int iTimeOut = 3000;
        setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
        setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));    
    
        if( SOCKET_ERROR==connect(hSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) )
        {        
            closesocket(hSocket);
            DWORD gle = WSAGetLastError();
    
            return;
        }
    
        char buff[] = "hello";
        int sl=::send(hSocket,(char*)buff, sizeof(buff), 0);
        if( sl<0 )
        {
            closesocket(hSocket);
            return ;
        }
        closesocket(hSocket);
    }
    
    // widonws: 設(shè)置socket TCP client connect非阻塞模式
    void SockSelect(char* strIP, UINT nPort)
    {
        SOCKET/*int*/ sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(sockfd < 0) 
        {
            return;
        }
        struct sockaddr_in serv_addr;
    
        //以服務(wù)器地址填充結(jié)構(gòu)serv_addr
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = inet_addr(strIP);
        serv_addr.sin_port = htons(nPort);
        int error = -1;
        int len = sizeof(int);
        timeval tm;
        fd_set set;
        unsigned long ul = 1;
        ioctlsocket(sockfd, FIONBIO, &ul); //設(shè)置為非阻塞模式
        bool ret = false;
        if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
        {
            tm.tv_sec  = 3;
            tm.tv_usec = 0;
            FD_ZERO(&set);
            FD_SET(sockfd, &set);
            if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
            {
                getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
                if(error == 0) 
                    ret = true;
                else 
                    ret = false;
            } 
            else 
                ret = false;
        }
        else 
            ret = true;
        ul = 0;
        ioctlsocket(sockfd, FIONBIO, &ul); //設(shè)置為阻塞模式
        if(!ret) 
        {
            closesocket( sockfd );
            fprintf(stderr , "Cannot Connect the server!/n");
            return;
        }
    
        fprintf( stderr , "Connected!/n");
    
        char buff[] = "hello";
        int sl=::send(sockfd,(char*)buff, sizeof(buff), 0);
    
        closesocket( sockfd );
    }

    復(fù)制代碼

    分類: c/c++, VC++

    posted on 2013-08-22 18:14 小高 閱讀(785) 評(píng)論(0)  編輯  收藏 所屬分類: C

    導(dǎo)航

    <2013年8月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類(352)

    收藏夾(19)

    關(guān)注的blog

    手冊(cè)

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费可以在线看A∨网站| 免费成人在线视频观看| 成人午夜视频免费| 69av免费观看| 亚洲国产亚洲片在线观看播放| 日韩精品人妻系列无码专区免费| 亚洲国产一区二区三区青草影视 | 黑人大战亚洲人精品一区 | 日本一区免费电影| 亚洲AV无码一区二区三区电影| 两个人日本WWW免费版 | 最近免费中文字幕MV在线视频3| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲色中文字幕在线播放| 成年美女黄网站18禁免费 | 久久精品a亚洲国产v高清不卡 | 亚洲欧洲无码AV不卡在线| 国产网站在线免费观看| 一级中文字幕免费乱码专区| 亚洲色大成网站WWW久久九九 | 亚洲AV无码一区二区乱孑伦AS| 91大神在线免费观看| 亚洲成a人片在线观看无码| 男女作爱免费网站| 国产小视频免费观看| 精品免费久久久久国产一区 | 亚洲国产综合精品中文第一| 国产麻豆剧传媒精品国产免费| 日本永久免费a∨在线视频| 亚洲AV无码1区2区久久| 免费av欧美国产在钱| 亚洲免费无码在线| 亚洲成在人线电影天堂色| 全黄性性激高免费视频| 日韩免费人妻AV无码专区蜜桃| 亚洲中文字幕乱码AV波多JI| 曰韩亚洲av人人夜夜澡人人爽| 日韩国产免费一区二区三区| 国产成人精品免费视频大全| 亚洲欧洲日本精品| 精品国产亚洲一区二区在线观看|