客户端通讯类
来源:互联网 发布:淘宝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;
}
- 客户端通讯类
- vc udp客户端异步通讯类封装
- 客户端与服务器通讯的类
- 客户端之间通讯问题
- 客户端通讯程序代码测试
- UDP通讯(客户端)
- TCP通讯(客户端)
- Android 客户端socket通讯
- 服务器--客户端通讯
- android 客户端通讯
- Redis-客户端通讯协议
- UDP通讯:服务器与客户端
- socket通讯 客户端和服务端
- 局域网通讯客户端 主要源代码
- 【C#】 Socket通讯客户端程序
- android 客户端与服务端通讯
- xmpp 及时通讯客户端开发
- Socket客户端和服务端通讯
- 草图设计软件---Balsamiq Mockups
- C# 捕获异常try...catch...finally
- 串口通讯类
- asp.net,cookie,写cookie,取cookie
- 语句
- 客户端通讯类
- java.util.logging.Logger 使用详解
- OPC Client 聊一下关于opc客户端
- 服务端通讯类
- XML 查找节点方法。
- PostgreSQL substring()函数
- sctp1
- pb中如何应付指针类型
- 阳光总在风雨后