本帖最后由 oyljerry 于 2011-06-03 13:31:17 编辑

解决方案 »

  1.   

    m_hSocket = socket(AF_INET, SOCK_STREAM, 0);
    -->
    m_hSocket = WSASocket(AF_INET, SOCK_STREAM, TPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
      

  2.   

    m_hSocket = socket(AF_INET, SOCK_STREAM, 0);
    这个socket默认不是OVERLAPPED吗??我看到了以前的帖子
    http://topic.csdn.net/t/20010620/14/165295.html
      

  3.   

    ret = recv(m_hSocket, ...);//再次接收,测试超时时间此时已经超时出错,getlasterr获得错误此时间间隔相对固定在60s吧。楼主不妨将整个代码段 贴出来,这样才能分析出问题。
      

  4.   

    本帖最后由 oyljerry 于 2011-06-03 13:30:46 编辑
      

  5.   

    代码:
    #ifdef WIN32
    #include <winsock2.h>
    #else
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #endif#include <time.h>
    #include <unistd.h>
    #include <iostream>using namespace std;#ifdef WIN32
    #pragma comment(lib, "ws2_32.lib")
    #endifvoid testTimeout()
    {
        char lsData[2048] = {0};
        struct sockaddr_in caddr;
    #ifdef WIN32
        int ltimeout = 30*1000;
    #else
        struct timeval ltimeout = {30, 0};
    #endif    int lisocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
        if(lisocket < 0)
          return;
        caddr.sin_family = AF_INET;
        caddr.sin_port = htons(25);
        caddr.sin_addr.s_addr = inet_addr("123.125.50.134");//163 smtp server    int liret = connect(lisocket, (const sockaddr*)&caddr, sizeof(caddr));
        if(liret != 0)
            return;    liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&ltimeout, sizeof(ltimeout));
       liret = recv(lisocket, lsData, sizeof(lsData), 0);
       cout<<lsData<<endl;   int t1 = time(NULL);
       liret = recv(lisocket, lsData, sizeof(lsData), 0);
       int t2 = time(NULL);   int t3 = t2 - t1;
       cout<<"t3:"<<t3<<endl;   shutdown(lisocket, 0x02);
       close(lisocket);
    }int main()
    {
        testTimeout();    return 0;
    }Ubuntu下结果:
    root@aa-desktop:/home/aa/Documents# ./testTimeout 
    220 163.com Anti-spam GT for Coremail System (163com[20101010])t3:30
    root@aa-desktop:
      

  6.   

      liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&ltimeout, sizeof(ltimeout));
     
    sizeof(ltimeout))应改为 sizeof(int));两个得数不一样
      

  7.   

    第二次接收WsaGetlasterror()是10060不?