64,682
社区成员
发帖
与我相关
我的任务
分享
bool CCoffee::Connect(void)
{
u_long ulTmp;
SOCKADDR_IN SockAddr;
Disconnect(); // 断开连接
// 创建socket
mc_SendSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if(mc_SendSocket == INVALID_SOCKET)
goto ErrEntry;
// 设置socket为阻塞方式
ulTmp = 0;
if(ioctlsocket(mc_SendSocket, FIONBIO, &ulTmp) != 0)
goto ErrEntry;
// 设置socket发送超时
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&mc_nSendTimeOut, sizeof(mc_nSendTimeOut)) != 0)
goto ErrEntry;
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&mc_nRecvTimeOut, sizeof(mc_nRecvTimeOut)) != 0)
goto ErrEntry;
// 连接服务端
InitSockAddr(&SockAddr, mc_ServerIpAddr.GetBuffer(), mc_Port);
if(connect(mc_SendSocket, (sockaddr *)&SockAddr, sizeof(SOCKADDR_IN)) != 0)
goto ErrEntry;
return TRUE;
ErrEntry:
int i = GetLastError();
Disconnect();
return FALSE;
}
void CCoffee::SendRecv(void)
{
char Buf[32768] = {0}; // 接收缓冲区
int nErr;
while(true)
{
memset(Buf,0,32768);
nErr = recv(mc_SendSocket, Buf, 32768, 0);
if(nErr == SOCKET_ERROR) // 有错误发生
{
nErr = WSAGetLastError();
if(nErr == WSAECONNRESET) {
// socket连接被peer端关闭,虚电路复位等错误,出现此类型的错误时socket必须被关闭。
//ForcePostMessage(WM_SOCKETCLOSE, 0, (LPARAM)m_pTcpClient);
break;
}
else
{
//ForcePostMessage(WM_SOCKETRECVERR, 0, (LPARAM)m_pTcpClient);
}
}
else if(nErr == 0) // socket被动关闭
{
//ForcePostMessage(WM_SOCKETCLOSE, 0, (LPARAM)m_pTcpClient);
break;
}
else // 接收到数据
{
SendDoRecv(Buf, nErr); // 处理接收到的数据
}
}; // while
}
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&mc_nSendTimeOut, sizeof(mc_nSendTimeOut)) != 0)
goto ErrEntry;
if(setsockopt(mc_SendSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&mc_nRecvTimeOut, sizeof(mc_nRecvTimeOut)) != 0)
goto ErrEntry;
这里发送了两次。。