169 lines
3.4 KiB
C++
169 lines
3.4 KiB
C++
|
|
#ifndef _LUA_SOCKET_HPP_
|
|||
|
|
#define _LUA_SOCKET_HPP_
|
|||
|
|
|
|||
|
|
/******************************************************************
|
|||
|
|
*封装一个简单的socket类给lua调用
|
|||
|
|
*
|
|||
|
|
*****************************************************************/
|
|||
|
|
#include "CustomSocket.h"
|
|||
|
|
|
|||
|
|
using namespace wylib::inet;
|
|||
|
|
|
|||
|
|
class LuaSocket : public socket::CCustomSocket
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
typedef socket::CCustomSocket BaseSocket;
|
|||
|
|
|
|||
|
|
LuaSocket(): buff_(NULL)
|
|||
|
|
{
|
|||
|
|
//printf("LuaSocket():%lld \n", (long long int)this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
virtual ~LuaSocket()
|
|||
|
|
{
|
|||
|
|
//printf("~LuaSocket():%lld \n", (long long int)this);
|
|||
|
|
|
|||
|
|
if (buff_)
|
|||
|
|
{
|
|||
|
|
free(buff_);
|
|||
|
|
buff_ = NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 建立连接,暂时只支持阻塞模式
|
|||
|
|
//通过32位IP地址连接到制定的端口,返回值为socket错误号,0表示成功。对于非阻塞模式返回0并不表示已经建立连接
|
|||
|
|
int connect(const double addr, const int port, bool block = true)
|
|||
|
|
{
|
|||
|
|
unsigned long long d;
|
|||
|
|
BaseSocket::setBlockMode(block);
|
|||
|
|
memcpy(&d, &addr, sizeof(addr));
|
|||
|
|
return BaseSocket::connect((u_long)d, port);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 带超时的连接
|
|||
|
|
int connect2(const double addr, const int port, int timeout)
|
|||
|
|
{
|
|||
|
|
unsigned long long d;
|
|||
|
|
memcpy(&d, &addr, sizeof(addr));
|
|||
|
|
return BaseSocket::connect((u_long)d, port, timeout);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int setSendTimeout(int timeout)
|
|||
|
|
{
|
|||
|
|
struct timeval tm = {timeout,0};
|
|||
|
|
//设置发送超时
|
|||
|
|
return setsockopt(m_nSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tm, sizeof(struct timeval));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int setRecvTimeout(int timeout)
|
|||
|
|
{
|
|||
|
|
struct timeval tm = {timeout,0};
|
|||
|
|
//设置发送超时
|
|||
|
|
return setsockopt(m_nSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tm, sizeof(struct timeval));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//向套接字写入内容,返回0表示连接已断开,返回SOCKET_ERROR表示发生错误,
|
|||
|
|
//暂时只支持写入字符串,可用于http协议
|
|||
|
|
int send(char* buf)
|
|||
|
|
{
|
|||
|
|
if (!buf) return SOCKET_ERROR;
|
|||
|
|
|
|||
|
|
return BaseSocket::send((void*)buf, (int)strlen(buf));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const char* readline(int& retval)
|
|||
|
|
{
|
|||
|
|
retval = 0;
|
|||
|
|
// 返回SOCKET_ERROR != retval && 0 != retval 表示还有数据可以读
|
|||
|
|
const int max_size = 1024;
|
|||
|
|
|
|||
|
|
if (!buff_) buff_ = (char*)malloc(max_size);
|
|||
|
|
|
|||
|
|
retval = recv(buff_, max_size - 1, 0);
|
|||
|
|
|
|||
|
|
if (retval >= 0)
|
|||
|
|
buff_[retval] = 0;
|
|||
|
|
|
|||
|
|
return buff_;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const char* readall(int& retval)
|
|||
|
|
{
|
|||
|
|
//printf("readall start:%lld \n", (long long int)this);
|
|||
|
|
const int max_size = 1024;
|
|||
|
|
int total = 0;
|
|||
|
|
retval = 0;
|
|||
|
|
|
|||
|
|
for (;;)
|
|||
|
|
{
|
|||
|
|
total += max_size;
|
|||
|
|
buff_ = (char*)(buff_ ? realloc(buff_, total) : malloc(total));
|
|||
|
|
|
|||
|
|
assert(buff_);
|
|||
|
|
|
|||
|
|
int len = recv(buff_ + retval, total - retval - 1);
|
|||
|
|
|
|||
|
|
if (len <= 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
retval += len;
|
|||
|
|
|
|||
|
|
if (retval < (total - 1)) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//printf("readall end:%lld \n", (long long int)this);
|
|||
|
|
buff_[retval] = 0;
|
|||
|
|
return buff_;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
static LuaSocket* NewSocket()
|
|||
|
|
{
|
|||
|
|
//printf("NewSocket threadid %d\n", (int)GetCurrentThreadId());
|
|||
|
|
LuaSocket* s = new LuaSocket();
|
|||
|
|
int err = s->createSocket(&s->m_nSocket);
|
|||
|
|
|
|||
|
|
if (err)
|
|||
|
|
{
|
|||
|
|
delete s;
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//printf("NewSocket:%lld \n", (long long int)s);
|
|||
|
|
return s;
|
|||
|
|
}
|
|||
|
|
static void Release(LuaSocket* s, int step)
|
|||
|
|
{
|
|||
|
|
if (!s) return;
|
|||
|
|
|
|||
|
|
//printf("Release:%lld \n", (long long int)s);
|
|||
|
|
|
|||
|
|
s->close();
|
|||
|
|
delete s;
|
|||
|
|
}
|
|||
|
|
static double GetHostByName(const char* host)
|
|||
|
|
{
|
|||
|
|
hostent* hostn = gethostbyname(host);
|
|||
|
|
u_long addr = 0;
|
|||
|
|
|
|||
|
|
if (hostn)
|
|||
|
|
{
|
|||
|
|
addr = *(u_long*)hostn->h_addr_list[0];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
double d;
|
|||
|
|
memcpy(&d, &addr, sizeof(d));
|
|||
|
|
return d;
|
|||
|
|
}
|
|||
|
|
private:
|
|||
|
|
char* buff_;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|