recv时,如果不知道要接收的数据长度,这个时候要如何处理啊? 发送一个命令到服务器端,服务器返回数据,但是返回过来的数据长度不定,这个时候应该如何对recv做处理,要采用阻塞还是非阻塞模式? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 循环接收,每次接收一个固定的长度,一直到接收完为止while(接受数据){} 同意楼上!你可以循环接收,固定循环接收的长度,while{ rev(s,(char*)(固定),sizeof(固定),0)}最后判定是否还有数据发来 你说的类似http断点续传,给socket 一个超时值,你成功连上主机后,就用一个缓冲区,循环接收,如果超时了就是没有了 回 ppzine(修练形意拳):你说的这种就是用异步吧?超时了就是没有了?但是这样能够保证数据全部都收下来吗?如果还有数据,但是接收过程中超时时间内没有收到数据,应该也是超时吧?但是这种情况下好象不能当作是没有数据呀?回 shusong1228(mugong):你说的这两个方法倒是比较常用的,给数据包加包尾的话有的时候比较难判断,因为在接收大量数据时有可能中间也碰到和包尾一样的数据吧? FD_SET ReadSet;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返回套接口上排队的第一个数据报大小。 我这几天学习SOCKET I/O模式,我想你应该用到这个吧里面就是处理SOCKET 套接字请求。有5种,你说的好象用SELECT模型可以解决。因为SELECT是选择有请求的套接字,对他进行处理。您不防试一下。可惜我学了5天了。也是学会一点皮毛。 socket5代理代码实现疑问? 托盘程序,一点最小化就崩溃 在VS2005中怎样显示透明窗口的边框 我新建了一个MFC 单文档界面, 要在 CXXXView 类中加入一幅 *.bmp 图像 请问如何实现类似于Windows画板 文本输入的功能(详情请进) 如何获得文件长度?? 目标机器积极的拒绝它? vs.net里不含iostream.h? 初学SDK,有些难点问题想请教各位!~ 请教一个困扰我很长时间的问题 如何得到快捷方式对应的实际路径呢? 急切:關於CRichEditView顯示内容超過64k的一個問題(真的很急,又不知道原因!)
while(接受数据)
{
}
while
{
rev(s,(char*)(固定),sizeof(固定),0)
}
最后判定是否还有数据发来
你说的这种就是用异步吧?
超时了就是没有了?但是这样能够保证数据全部都收下来吗?如果还有数据,但是接收过程中超时时间内没有收到数据,应该也是超时吧?但是这种情况下好象不能当作是没有数据呀?回 shusong1228(mugong):
你说的这两个方法倒是比较常用的,给数据包加包尾的话有的时候比较难判断,因为在接收大量数据时有可能中间也碰到和包尾一样的数据吧?
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返回套接口上排队的第一个数据报大小。