另外,为什么我setsockopt()之后,getsockopt()它返回-1(失败)呢?

解决方案 »

  1.   

    你要判断setsockopt返回值啊,单不调试下看对不对。
      

  2.   


    WSASend()函数还是将我指定的Buffer复制了一份到底层的Queue这个你是怎么知道的?你调试windows内核了?还有设置SendBuf为0的效果只是省略到了应用程序将数据拷贝到系统缓冲区的过程,而直接将数据拷贝给协议栈。
    如果SendBuf不为0,那么应用是先将数据拷贝到系统缓冲区,然后协议栈在从系统缓冲区中读数据发送。
      

  3.   

    我是这样知道的,实验如下: 每次调用发送,都只用了几十个us,即函数是立即返回,我用的是同一个Buffer,即每次发送,都把这个Buffer递给WSASend()函数: char buf[4096];
    memset(buf,'_',4096); TEST_BEGIN(total);
    TEST_BEGIN(a);
    buf[0]='a';
    buf[4095]='a';
    SendData(ClientList.GetTail(), buf,4096);
    TEST_END(a); TEST_BEGIN(b);
    buf[0]='b';
    buf[4095]='b';
    SendData(ClientList.GetTail(), buf,4096);
    TEST_END(b); TEST_BEGIN(c);
    buf[0]='c';
    buf[4095]='c';
    SendData(ClientList.GetTail(), buf,4096);
    TEST_END(c); TEST_BEGIN(d);
    buf[0]='d';
    buf[4095]='d';
    SendData(ClientList.GetTail(), buf,4096);
    TEST_END(d); TEST_END(total); TEST_REPORT_US(a);
    TEST_REPORT_US(b);
    TEST_REPORT_US(c);
    TEST_REPORT_US(d);
    TEST_REPORT_US(total);
      

  4.   

    #define TEST_BEGIN(N) LARGE_INTEGER TimeTickBegin##N; LARGE_INTEGER TimeTickEnd##N; QueryPerformanceCounter(&TimeTickBegin##N);
    #define TEST_END(N) QueryPerformanceCounter(&TimeTickEnd##N);#define TEST_RESULT_US(N) (((TimeTickEnd##N.QuadPart-TimeTickBegin##N.QuadPart)*1000000) / PerformanceFreq.QuadPart)
    #define TEST_RESULT_MS(N) (((TimeTickEnd##N.QuadPart-TimeTickBegin##N.QuadPart)*1000) / PerformanceFreq.QuadPart)#define TEST_REPORT_US(N) LogLine("Test " #N " time consumed: %u us", TEST_RESULT_US(N));
    #define TEST_REPORT_MS(N) LogLine("Test " #N " time consumed: %u ms", TEST_RESULT_MS(N));
      

  5.   

    发送到我的另一台电脑的结果是:
    a____ab_____bc_____cd____d