1,314
社区成员




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;
}