如题
解决方案 »
- 求助单文档分割窗口
- 高分求《visual C++系统开发实例精选》光盘内容?
- 求log4cpp或log4cplus 已编译好源文件 在VS2005或2008能正常使用的类库
- list control 问题
- 关于 “missing storage-class or type specifiers”视频采集
- Visual C++.net2003中遇到CListCtrl类出现中文乱码问题
- 哪里有PEFILE.DLL和它的源码下载?谢谢
- jpeg和bmp格式的相互转换
- 问题超简单,但是我不会 :)
- 怎样才能记住MFC中那些大量的成员函数名及其作用呢?
- 服务主机ip和端口知道,只要用普通的socket连接就能连上去了么?
- 在WinSock编程中,应如何在服务器端设置本地IP号??
unsigned long rlen;
//中间的代码省略
while (true)
{
FD_ZERO(&ReadSet);
FD_SET(sClient,&ReadSet);
if (select(0,&ReadSet,NULL,NULL,NULL)==SOCKET_ERROR)//阻塞在select调用,当有数据到来时select返回
return WSAGetLastError();
if (FD_ISSET(sClient,&ReadSet))
{
if (ioctlsocket(sClient,FIONREAD,&rlen))//判断接收缓冲区有多少字节数据
return WSAGetLastError();
rlen=MIN(rlen,sizeof(buf));
memset(buf,0,sizeof(buf));
if (recv(sClient,buf,rlen,0)<1)
return WSAGetLastError();
break;
}
}
此处是tcp,udp是一样,只不过tcp中ioctlsocket返回的接收缓冲区所有数据,udp中ioctlsocket返回套接口上排队的第一个数据报大小。
不如分配一个大点的数组...比如1024,2048,4096...反正提交物理内存块时一般是4k,就算你只用1BYTE也会这样...
我在找如何知道tcp缓冲区内有多少字节可以接收数据。
现在明白了。
再次感谢。