客户端通讯类

来源:互联网 发布:淘宝h5页面制作 编辑:程序博客网 时间:2024/05/14 05:57

class CSocketClient
{
private:
 SOCKET m_socket;

public:
 static CSocketClient* GetInstance();

 ~CSocketClient(void);

 bool Connect(const char* ipAddress,unsigned short port);
 bool DisConnect();
 bool SndMessage(const unsigned char* buf, int buflen);
 bool RcvMessage(unsigned char* buf, int buflen, int& rcvlen);
private:
 CSocketClient(void);
 static CSocketClient* instance;

};

 

CSocketClient::CSocketClient(void)
{
 m_socket = INVALID_SOCKET;
}

CSocketClient::~CSocketClient(void)
{
 DisConnect();
}

CSocketClient* CSocketClient::instance = new CSocketClient();
CSocketClient* CSocketClient::GetInstance()
{
 return instance;
}

bool CSocketClient::Connect(const char* ipAddress,unsigned short port)
{
 if (m_socket != INVALID_SOCKET)
 {
  return false;
 }
 int                         Flag;
 WSADATA wsaData;
 struct sockaddr_in          Sin;


 int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
 if (iResult != NO_ERROR)
 {
  printf("WSAStartup failed with error: %d/n", iResult);
  return false;
 }

 m_socket = socket(AF_INET, SOCK_STREAM, 0);
 if(INVALID_SOCKET == m_socket)
 {
  printf("socket failed with error: %ld/n", WSAGetLastError());
  WSACleanup();
  return false;
 }

 memset(&Sin, 0, sizeof Sin);
 Sin.sin_family = AF_INET;
 Sin.sin_addr.s_addr = inet_addr(ipAddress);
 Sin.sin_port = htons(port);

 iResult = connect(m_socket, (struct sockaddr *)&Sin, sizeof(Sin));

 if( 0 > iResult )
 {
  closesocket(m_socket);
  WSACleanup();
  m_socket == INVALID_SOCKET;
  return false;
 }

 setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, (char*)&Flag, sizeof Flag);

 return true;
}

bool CSocketClient::DisConnect()
{
 if (m_socket == INVALID_SOCKET)
 {
  return true;
 }

 shutdown(m_socket,SD_BOTH);
 closesocket(m_socket);
 WSACleanup();
 m_socket = INVALID_SOCKET;

 return true;
}

InterLock clientSndLock;
bool CSocketClient::SndMessage(const unsigned char* buf, int buflen)
{
 AutoLock<InterLock> autoLock(clientSndLock);

 if (m_socket == INVALID_SOCKET)
 {
  return false;
 }

 int havesnd = 0;

 while (havesnd < buflen)
 {
  int rc = send(m_socket, (char*)(buf + havesnd), buflen-havesnd, 0);
  if(rc == SOCKET_ERROR)
  {
   return false;
  }
  havesnd += buflen;
 }

 return true;
}

InterLock clientRcvLock;
bool CSocketClient::RcvMessage(unsigned char* buf, int buflen, int& rcvlen)
{
 AutoLock<InterLock> autoLock(clientRcvLock);

 if (m_socket == INVALID_SOCKET)
 {
  return false;
 }

 fd_set          readfds;
 struct timeval  timeout;

 timeout.tv_sec = 1000 / 1000u;
 timeout.tv_usec = (1000 % 1000u) * 1000u;

 FD_ZERO(&readfds);

 FD_SET(m_socket, &readfds);
 int rc = select(-1, &readfds, NULL, NULL, &timeout);
 if (rc < 0)
 {
  return false;
 }
 else if (rc == 0)
 {
  rcvlen = 0;
  return 0;
 }

 rc = recv(m_socket, (char*)buf, buflen, 0);
 if (rc <= 0)
 {
  return false;
 }

 rcvlen = rc;

 return 0;
}

原创粉丝点击