如果将send的每次发送长度定在1000,多次调用send的时候发现会出现发送失败的情况,如果遇到这种情况是不是必须要关闭连接,如果进行一定的延迟后会不会能够继续发送?
例如将发送函数写成如下为什么会有时后出现不能全部成功发送完毕,发送一部分后send函数返回-1?int mComm::SendData(SOCKET ss,int route)
{
int tlen;
int sentnum,timecount;
int totalsent=0;
timecount=0;
tlen=10;
lSendLenOld[route]=0;
while(tlen>0)
{
JudgeEachConnection(ss,route);     //判断该连接能不能发送 if (timecount>180)
{
#ifdef _DEBUG
int ti;
ti = WSAGetLastError();
CatchRcvErr(ti);
                            #endif
mCloseSocket(route);
return -1;
} if (CanSendFlag[route])   //如果能发送
{
CanSendFlag[route] = false;
tlen=lSendLen-lSendLenOld[route];    //lSendLen为要发送的总长度
if(tlen<=0)
{
return 0;
}
if (tlen>1000)
tlen=1000;

sentnum=send(ss,(char*)&SendMsg[lSendLenOld[route]],tlen,0);

if (sentnum==SOCKET_ERROR)
{
if ( WSAEWOULDBLOCK == WSAGetLastError() )
{
Sleep(100);
continue;
}
else
break;

}
lSendLenOld[route]+=sentnum;
}
else
{
timecount++;
Sleep(500);
}
}
return 0;
希望高人指点!!!!
}

解决方案 »

  1.   

    void mComm::JudgeEachConnection(SOCKET ts,int route)
    {
    int ti;
    timeval mWaitTime;
    fd_set fdRead,fdWrite; mWaitTime.tv_sec = 0;
    mWaitTime.tv_usec = 0;
    FD_ZERO(&fdRead);
    FD_ZERO(&fdWrite); FD_SET(ts,&fdRead); 
    FD_SET(ts,&fdWrite); ti = select(NULL,&fdRead,&fdWrite,NULL,&mWaitTime);
    if (FD_ISSET(ts,&fdRead))
    CanRcvFlag[route] = true;
    if (FD_ISSET(ts,&fdWrite))
    CanSendFlag[route] = true;
    else
    CanSendFlag[route] = false; FD_ZERO(&fdRead);
    FD_ZERO(&fdWrite); }
      

  2.   

    发送时不能反复调用的, 因为这样,如果数据多的话,很快缓冲区就被你的 send 填满了. 之后的send 就会返回失败. 可以使用 select 模型, 当套接字可写时就发送一个包,然后继续检测. 直到以发送完所有的数据
      

  3.   

    我在JudgeEachConnection中不是用select模型进行判断了了吗?为什么还不行?
      

  4.   

    用GetLastError获得错误代码看看是什么错误吧
      

  5.   

    另外send的发送缓冲默认是多少?send的发送长度最大可以设置为多大,就是第三个参数,有人说设置的大点就可以避免多次调用send而引起不必要的问题,但是想不通的是,为什么说设置大点少发几次能成功,而设置小点多发几次就不能成功会出现SOCKET_ERROR错误呢?!!同样是发送100K的数据,同样是默认的发送缓冲,为什么会出现这样的结果???
      

  6.   

    send默认8192,但是设置这个不能解决问题,你应该在发送的时候使用两种方式:1、开线程,采用阻塞模型;2、采用异步发送,循环发送,并计算发送的字节数,遇到-1则检查错误是不是未完成,等待、重发
      

  7.   

    这里有说明http://dev.csdn.net/develop/article/16/16677.shtm
      

  8.   

    刚刚做了一个实验,在发送大文件的时候调用SendData函数(见上),中途拔掉网线,这时会发现检测时会返回连接不能为写,然后插好网线恢复网络,在检测到连接可写后,send函数却仍然返回-1,为什么?怎么才能让它能够继续发送呢?????