18,356
社区成员
发帖
与我相关
我的任务
分享
select不是这么用的~~~~
#define SEND_TRY_TIMES 0
//只有全部发送完时才返回大于0(同时也等于*pBytesSend的值)
//否则返回值同select或send函数,pBytesSend保存实际发送字节数,内部会先select
int SendData(SOCKET m_sock, const char* msg, int len, int* pBytesSend)
{
fd_set fdRead;
timeval TimeOut;
int ret, nLeft(len), idx(0), i(0);
TimeOut.tv_sec = 0;
TimeOut.tv_usec = 500;
do
{
FD_ZERO(&fdRead);
FD_SET(m_sock, &fdRead);
ret = select(m_sock+1, NULL, &fdRead, NULL, &TimeOut);
if (ret > 0)
{
ret = send(m_sock, msg+idx, nLeft, 0);
if (ret == 0) //对方连接中断
{
*pBytesSend = idx;
return ret;
}
if (ret == SOCKET_ERROR)
{
*pBytesSend = idx;
return ret;
}
idx += ret;
nLeft -= ret;
}
else if(SOCKET_ERROR==ret)
{
*pBytesSend = idx;
return ret;
}
else//select超时
{
if(++i>SEND_TRY_TIMES)//重试SEND_RECV_TRY_TIMES次失败则返回失败
{
*pBytesSend = idx;
return ret;
}
}
}
while (nLeft > 0);
*pBytesSend = idx;
return idx;
}