我在一个套接字(tcp,udp类型的都有)上循环发送大量数据,因为是大量数据循环发送,且每次发送前不能有延迟,所以为了防止缓冲区溢出,我想每次在发送数据前查询一下该套接字的系统缓冲池中是否还有数据待发,如果有,我就丢弃要发的数据(不是系统缓冲池中待发的数据)。不知有什么办法知道系统缓冲池中是否还有数据待发?
解决方案 »
- 关于setcursor的问题
- 基于MFC的OpengGL shading language问题!
- 提问一个位操作问题,怎样用四个字节表示IP地址,怎样读取出来
- 关于内存资源的问题
- 求救高手:程序退出时总是异常,说诊断失败
- 怎样得到一个控件的大小(尺寸)?怎样使控件失去焦点(LostFocus?好像没有啊)
- 初学者100分求救:我的VC6设置可能出了问题!
- 哪里有win2000 sdk开发包可以下载?
- 关于CComboBox的小小问题!
- 请高手点评:真正的网络三维引擎!www.fivestar-china.com!——提提意见!
- 关于VC学习方法的问题(请高手进来指教谢谢)
- rtti最简单的问题
这个选项只是在recv的时候有效,在send的时候有效吗?
你查一下具体访问它们的函数吧,我记不太清了。
你自己判断一下?不过这样的效率太低了!那位有更好的办法?
不够TCP下的这个概念我现在也不太清楚.
一个是窗口大小.
一个是套接字缓冲区大小.
还有一个是MSS大小,这三个大小各有什么用处,哪位能讲讲吗?
我看了LINUX原代码里面好像都是取决于网络的MSS大小,其他的都用处不大.
感觉就是你想要的功能。没有你想象那么麻烦的。
FD_SET(pConnecct->conSocket,&m_detected); if(select(0,NULL,&m_detected,NULL,NULL) == SOCKET_ERROR )
{
UINT ret = WSAGetLastError();
if(WSAENETDOWN == ret)
pConnecct->tickcount++;
if(WSAENOTSOCK == ret)
pConnecct->tickcount++;
}else
{
pConnecct->tickcount = 0;
}
FD_ZERO(&readfds);
FD_SET(sock,&readfds);
timeout.tv_sec=5; //5s
timeout.tv_usec=0;
select(0,&readfds,0,0,&timeout);
这三个问题的个人理解:套接字缓冲区大小和窗口大小:操作系统底层实际上给每个套接字分配了一个默认大小的缓冲区。发送数据时,send()函数会立即返回,但并不表示数据已经传到网络上,而只是已经放到了缓冲区了。缓冲区中的数据什么时候发送是由对方的窗口大小决定的。而对方的窗口大小被放在对方回应你的数据中。如果对方的窗口大小大于0,则缓冲区中的数据就会被自动发送出去。
而窗口大小是由什么决定的呢?是由接受数据的那个套接字的缓冲区决定的,如果缓冲区没有满的话,就把窗口大小置大于0,否则小于0。
网络的MSS大小:我觉得这是由网络设备,如路由器,交换机和网络环境决定的,他决定了你发送的数据是否要分片,每片被分成多大。如果你的数据大于网络的MSS,则要分片,否则按原包发送。个人见解,仅供参考.
如果是udp的话,而2.5k的数据是一个完整的数据包的话,他会丢掉整个数据包.但是对于tcp,因为是数据流,我不知道丢掉的是2.5k还是会先填满缓冲池,而只丢掉1.5k