请教关于如何实现socket中一次发送大量数据得问题

brucewy 2005-04-28 07:09:07
我用了下面的方法发送数据
long nBytes=50000,nLeft,idx,r;
nLeft=nBytes;
idx=0;
while(nLeft>0)
{
r=this->cbi_send(this->iCSockfd,&pcSndBuf[idx],nLeft,iFlag);
sleep(0.5);
if(r==-1)
{
return -1;
}
nLeft-=r;
idx+=r;
}
发送端是solaris,接收端是windows2000
接收函数为VC编写:

long iRcv,nLeft,idx;
nLeft=50000;
idx=0;
while(nLeft>0)
{
iRcv = this->Receive(&recvbuff[idx],nLeft);
idx+=iRcv;
nLeft-=iRcv;
}
我这样做,主要是为了保证数据可以完整的传输,因为我发现如果不加循环,数据量大了以后会出现无法一次接收完整数据的问题。
但是最近好像网管做了什么限制,使得我的程序总是会停在Receive()里面,半天才能接收几K的数据,我又测试了一下,发现如果每次发送得数据(不加循环发送)是几百字节得话,就没有问题;
请教一下各为高人,有没有什么其他方法能够让我在循环中每次发几百字节,一点一点将数据发送出去,上面我用得这个方法,在接收数据时总是停在Receive里,好像不行;求教其他方法或是大家有没有碰到过这种问题,如何解决

另外还想问一下,一次发送数据量大得时候,发不出去,或是半天收不到,可能与网络方面得什么设置有关吗?
...全文
274 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
AntonlioX 2005-06-28
  • 打赏
  • 举报
回复
mark
c4313848 2005-04-29
  • 打赏
  • 举报
回复
要是数据量太大,可能会阻塞,可以用WSAAsyncSelect的FD_WRITE,这个好像就是SOCKET的发送缓冲区满了,等倒缓冲区有空闲了就会自动发送

aiyue2010 2005-04-29
  • 打赏
  • 举报
回复
思路如下:
#define SIZE 4096
long lTotalByte, lTotalTransfered;
int nNum;
while(lTotalTransfered < lTotalByte)
{
if((nNum = send(****,SIZE,*****)) == SOCKET_ERROR)
{
//错误处理
}
else
{
lTotalTransfered += nNum;
}
}
xift_2008 2005-04-28
  • 打赏
  • 举报
回复
数据量太大的话,就会阻塞在send()函数处,每次发送的数据量应该取一个比较
合适的值才行。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧