请教关于IOCP模型中如何设置Socket的Send Buffer? 另外,为什么我setsockopt()之后,getsockopt()它返回-1(失败)呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你要判断setsockopt返回值啊,单不调试下看对不对。 WSASend()函数还是将我指定的Buffer复制了一份到底层的Queue这个你是怎么知道的?你调试windows内核了?还有设置SendBuf为0的效果只是省略到了应用程序将数据拷贝到系统缓冲区的过程,而直接将数据拷贝给协议栈。如果SendBuf不为0,那么应用是先将数据拷贝到系统缓冲区,然后协议栈在从系统缓冲区中读数据发送。 我是这样知道的,实验如下: 每次调用发送,都只用了几十个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); #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)); 发送到我的另一台电脑的结果是:a____ab_____bc_____cd____d 一个程序为什么在别的电脑上就不行,VC6.0写的程序 mfc多线程 undeclared identifier 求助mfc对话框的问题 vc的饼子们进来! 使用COleDateTime类的<操作符问题。 可执行文件生成后,怎么把相关的DLL文件绑在一起? 如何判断打印机是否联机? 各位vc大哥,请问怎么做快捷菜单阿?急!!!!!!! GetModuleHandle为什么返回的句柄是NULL 为什么我的 文件能存,但打不开啊 MFC的CFileDialog对话框如何中列出文件大小在50以上的文件 在Word中复制中文引号粘贴到文本框中变英文引号
WSASend()函数还是将我指定的Buffer复制了一份到底层的Queue这个你是怎么知道的?你调试windows内核了?还有设置SendBuf为0的效果只是省略到了应用程序将数据拷贝到系统缓冲区的过程,而直接将数据拷贝给协议栈。
如果SendBuf不为0,那么应用是先将数据拷贝到系统缓冲区,然后协议栈在从系统缓冲区中读数据发送。
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);
#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));
a____ab_____bc_____cd____d