64,646
社区成员
发帖
与我相关
我的任务
分享
long ClientTCP::Open()
{
m_Socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (m_Socket == SOCKET_ERROR)
{
m_csStatus = ctDisConnect;
return -1;
}
unsigned long ulargp = 1;
int iRet = ::ioctlsocket(m_Socket, FIONBIO, (unsigned long*)&ulargp); //设置成非阻塞方式
if(SOCKET_ERROR == iRet)
{
::shutdown(m_Socket, 0);
::closesocket(m_Socket);
m_Socket = INVALID_SOCKET;
return -3;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(m_usHostPort);
addr.sin_addr.s_addr = ::inet_addr(m_strHostIp.c_str());
memset(addr.sin_zero, 0, 8);
struct timeval timeout;
fd_set rfd;
FD_ZERO(&rfd);
FD_SET(m_Socket, &rfd);
timeout.tv_sec = 3;
timeout.tv_usec =0;
connect(m_Socket, (struct sockaddr*)(&addr), sizeof(sockaddr_in));// 连接
iRet = ::select(m_Socket + 1, NULL, &rfd, NULL, &timeout); //判断套接字的写状态
if (iRet <= 0)
{
}
else
{
}
//创建发送线程
m_Terminate = false;
m_hThreadSend = ::CreateThread(NULL, 0, ThreadProcSend, this, CREATE_SUSPENDED, &m_dwThreadSendId);
if (NULL == m_hThreadSend)
{
return -2;
}
DWORD dwLastSuspendCount = ::ResumeThread(m_hThreadSend);
}
DWORD WINAPI ClientTCP::ThreadProcSend(LPVOID lpParameter)
{
CLSClientTCP* pClient = (CLSClientTCP*)lpParameter;
while (!pClient->m_Terminate)
{
struct timeval timeout;
fd_set rfd;
FD_ZERO(&rfd);
FD_SET(pClient->m_Socket, &rfd);
timeout.tv_sec = 3;
timeout.tv_usec =0;
//通过select判断写状态,进而判断与服务端是否正常连接
int iRet = ::select(pClient->m_Socket + 1, NULL, &rfd, NULL, &timeout);
//如果小于零就重连服务端,但是当我把服务端软件关闭后,上面一行的select还是返回1,这是
//为什么呀?
if (iRet <= 0)
{
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(pClient->m_usHostPort);
addr.sin_addr.s_addr = ::inet_addr(pClient->m_strHostIp.c_str());
memset(addr.sin_zero, 0, 8);
struct timeval timeout;
fd_set rfd;
FD_ZERO(&rfd);
FD_SET(pClient->m_Socket, &rfd);
timeout.tv_sec = 3;
timeout.tv_usec =0;
connect(pClient->m_Socket, (struct sockaddr*)(&addr), sizeof(sockaddr_in));
int iRet = ::select(pClient->m_Socket + 1, NULL, &rfd, NULL, &timeout);
if (iRet <= 0)
{
continue;
}
else
{
}
}
if(pClient->m_csStatus == ctConnect)
{
// 发送数据
}
return 0;
}