socket 使用select发送数据。

玉生香 2017-06-20 10:47:34
使用的select实现的收发功能。
客户端发送数据,服务端接收数据。
客户端(发送一条) ---->服务端(接收)---》服务端(发送回执)-->客户端(接收回执)
现在纯收发,不在任何操作,数据发送才500条每秒。现在要求每秒达到发送1500条,有什么好办法体能性能。

当前发现读取数据时,要1毫秒的延迟。发送100微妙。

求大神给个办法,下面是一些关键代码,






BOOL STC::Socket(int af, int type,int protocol,BOOL bNagle) //创建socket,由其它成员函数调用
{

const int SENDBUFLEN = 1024*1024;
const int RECVBUFLEN = 1024*1024;
if( (m_socket = socket(af, type, protocol))<0)
{
return FALSE;
}
else
{
int flag = 1;
//设置非等待要禁用 Nagle 算法
//ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
if(!bNagle)
{
if(setsockopt( m_socket, 6, 1, (char *)&flag, sizeof(flag) ) == -1)
{
return FALSE;
}
}
int recvbuflen = RECVBUFLEN;
if (setsockopt(m_socket, SOL_SOCKET, SO_RCVBUF, &recvbuflen, sizeof(int)) < 0)
{
return FALSE;
}

int sendbuflen = SENDBUFLEN;
if (setsockopt(m_socket, SOL_SOCKET, SO_SNDBUF, &sendbuflen, sizeof(int))<0)
{
return FALSE;
}

return TRUE;
}
}



//uMilliseconds 默认10
BOOL STC::IsSelectFD(const UINT uMilliseconds,const UINT uType/*=read*/) //判断一个socket是否有数据可读写
{
ReSetErr();
if(!IsValidSocket())
{
SetErr(e_invalid);
return FALSE;
}

struct timeval tv;
fd_set readfds;
tv.tv_sec = uMilliseconds/1000;
tv.tv_usec = uMilliseconds%1000 * 1000;
FD_ZERO(&readfds);
FD_SET(m_socket, &readfds);

if(uType == read)
{//是否可读
select(int(m_socket + 1), &readfds, NULL, NULL, &tv);
//printf("select : %d \n",ret);
}
else
{//是否可写
select(int(m_socket + 1), NULL,&readfds, NULL, &tv);
//printf("select : %d \n",ret);
}
if(FD_ISSET(m_socket, &readfds))
{
return TRUE;
}
else
{
return FALSE;
}
}


BOOL STC::Recv(char *pszBuf, const UINT uLen,const UINT uMilliseconds)/*指定接收长度的数据*/
{
ReSetErr();

if(uLen==0 || uLen > MAX_PACKLEN)
{
return FALSE;
}

int nLen = 0;/*已接收数据*/
RTimer tIn;/*开始时间*/

while(1)
{
int n;
if(IsSelectFD())
{
n = recv(m_socket, pszBuf + nLen,uLen - nLen,0);
}
else
{
if(tIn.elapsed() > uMilliseconds)
{
return FALSE;
}
continue;
}
if(n == 0)
{
Close();
return FALSE;
}
else if(n<0)
{
if(errno == EINTR)/*Interrupted function call - 中断系统调用*/
{
continue;
}
else
{
Close();
return FALSE;
}
}
else/*>0*/
{
nLen += n;
if(nLen == static_cast<int>(uLen))
{
break;
}
if(tIn.elapsed() > uMilliseconds)
{
return FALSE;
}
}
}
return TRUE;
}


BOOL STC::Send(const char *lpszBuf, UINT uLen) //发送数据
{
if(!IsValidSocket())
{

return FALSE;
}

ReSetErr();

UINT sendLen = 0;
while(sendLen < uLen)
{
int rlt=0;
if((rlt = send(m_socket,lpszBuf + sendLen,uLen - sendLen,0)) == -1)
{
//printf("errno = %d error=%s\n",errno,strerror(errno));

return FALSE;
}

sendLen += rlt;
}

return TRUE;
}
...全文
790 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
玉生香 2017-06-22
  • 打赏
  • 举报
回复
自己顶,求助

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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