64,649
社区成员
发帖
与我相关
我的任务
分享
//发送数据
int SendData(DataHeader* header)
{
if (header)
{
return send(_sockfd, (const char*)header, header->dataLength, 0);
}
return SOCKET_ERROR;
//}
//发送数据
int SendData( DataHeader* header)
{
int ret = SOCKET_ERROR;
//要发生的数据长度
int nSendLen = header->dataLength;
//要发送的数据
const char* pSendData = (const char*)header;
while (true)
{
if (_lastSendPos + nSendLen >= SEND_BUFF_SIZE)
{
// 计算可以拷贝的数据长度
int nCopyLen = SEND_BUFF_SIZE - _lastSendPos;
//拷贝数据
memcpy(_szSendBuf + _lastSendPos, pSendData, nCopyLen);
//计算剩余数据位置
pSendData += nCopyLen;
//计算剩余数据长度
nSendLen -= nSendLen;
ret = send(_sockfd, _szSendBuf, SEND_BUFF_SIZE, 0);
//数据尾部置为0
_lastSendPos = 0;
//如果发送错误,比如网络断开,客户端断开
if (SOCKET_ERROR==ret)
{
return ret;
}
}else
{
//将要发送的数据拷贝到发送缓冲区的尾部
memcpy(_szSendBuf + _lastSendPos, pSendData, nSendLen);
//计算数据尾部位置
_lastSendPos += nSendLen;
break;//当要发送的数据大于缓冲区时,循环发送,小于时跳出循环
}
}
return ret;
}
//发送数据
int SendData( DataHeader* header)
{
int ret = SOCKET_ERROR;
//要发生的数据长度
int nleft = header->dataLength;
const char *sendptr = (char *)header;
while (nleft > 0)
{
//只管把剩余的一起发了,就算是非阻塞的,系统发送不完也没关系的
//通过ret告知你,此次send成功发送了多少
ret = send(_sockfd, sendptr, nleft, 0);
if (SOCKET_ERROR==ret)
{
return ret;
}
else{
nleft -= ret;
sendptr += ret;
}
}
return nleft; //返回成功写了多少
}