예제 #1
0
Win32CallstackResolver::AddrInfo Win32CallstackResolver::GetAddrInfoForModule(uint32_t moduleId, DWORD64 addr)
{
	wchar_t msg[1024];
	swprintf_s(msg, L"getaddr %d %llu", moduleId, addr);

	AddrInfo *info = (AddrInfo *)SendRecvPipeMessage(msg);
	return info == NULL ? AddrInfo() : *info;
}
예제 #2
0
파일: lsock.cpp 프로젝트: Thobian/xlualib
static int LUA_C_udp_send(lua_State* ls)
  {
  SOCKET_ST* st = (SOCKET_ST*)luaL_checkudata(ls, 1, gk_udp_register);
  size_t len = 0;
  const char* buf = luaL_checklstring(ls, 2, &len);

  if(lua_type(ls, 3) == LUA_TNUMBER)
    {
    sockaddr_in addr;
    addr.sin_addr.s_addr = lua_tointeger(ls, 3);
    xmsg msg;
    msg
      << (int)addr.sin_addr.s_net << '.'
      << (int)addr.sin_addr.s_host << '.'
      << (int)addr.sin_addr.s_lh << '.'
      << (int)addr.sin_addr.s_impno;
    lua_pushstring(ls, msg.c_str());
    lua_replace(ls, 3);
    }

  auto ip = luaL_optstring(ls, 3, "0.0.0.0");
  auto port = luaL_optstring(ls, 4, "0");

  try
    {
    auto addrto = AddrInfo(ip, port);

    if(addrto.sin_addr.S_un.S_addr == 0 && addrto.sin_port == 0)
      {
      addrto = st->addr;
      }

    while(len > 0)
      {
      int sendlen = ::sendto(st->sock, buf, len, 0,
        (const sockaddr *)&addrto, sizeof(addrto));

      if(sendlen <= 0)
        {
        return UDP_ERROR(ls, st, xmsg() << "UDP发送失败:" << WSAGetLastError());
        }
      len -= sendlen;
      buf += sendlen;
      }
    }
  catch(const runtime_error& err)
    {
    return UDP_ERROR(ls, st, xmsg() << "UDP发送错误:" << err.what());
    }
  catch(...)
    {
    return UDP_ERROR(ls, st, "UDP发送异常");
    }
  lua_settop(ls, 1);
  return 1;
  }
예제 #3
0
파일: lsock.cpp 프로젝트: Thobian/xlualib
static int LUA_C_tcp_new(lua_State* ls)
  {
  xWSA wsa;
  SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET)
    {
    xmsg msg;
    msg << "建立tcp socket失败:" << WSAGetLastError();
    lua_pushstring(ls, msg.c_str());
    return lua_error(ls);
    }
  if(lua_type(ls, 1) == LUA_TNUMBER)
    {
    sockaddr_in addr;
    addr.sin_addr.s_addr = lua_tointeger(ls, 1);
    xmsg msg;
    msg
      << (int)addr.sin_addr.s_net << '.'
      << (int)addr.sin_addr.s_host << '.'
      << (int)addr.sin_addr.s_lh << '.'
      << (int)addr.sin_addr.s_impno;
    lua_pushstring(ls, msg.c_str());
    lua_replace(ls, 1);
    }
  auto ip = luaL_optstring(ls, 1, "0.0.0.0");
  auto port = luaL_optstring(ls, 2, "0");

  auto bind_port = luaL_optinteger(ls, 3, 0);

  try
    {
    auto addr = AddrInfo(ip, port);

    if(bind_port != 0)
      {
      auto s = AddrInfo(INADDR_ANY, bind_port);
      if(bind(sock, (sockaddr*)&s, sizeof(s)))
        {
        shutdown(sock, SD_BOTH);
        closesocket(sock);
        xmsg msg;
        msg << "tcp socket绑定[" << (intptr_t)htons(addr.sin_port)
          << "]失败:" << (intptr_t)WSAGetLastError();
        lua_pushstring(ls, msg.c_str());
        return lua_error(ls);
        }
      if(listen(sock, 0))
        {
        shutdown(sock, SD_BOTH);
        closesocket(sock);
        xmsg msg;
        msg << "tcp socket监听[" << (intptr_t)htons(addr.sin_port)
          << "]失败:" << (intptr_t)WSAGetLastError();
        lua_pushstring(ls, msg.c_str());
        return lua_error(ls);
        }
      }
    else
      {
      if(addr.sin_addr.S_un.S_addr == INADDR_ANY || addr.sin_port == 0)
        {
        lua_pushstring(ls, "tcp socket 请明确指定连接的地址、端口");
        return lua_error(ls);
        }
      if(connect(sock, (sockaddr*)&addr, sizeof(addr)))
        {
        shutdown(sock, SD_BOTH);
        closesocket(sock);
        xmsg msg;
        msg << "tcp socket连接[" << IpString(addr)
          << "]失败:" << (intptr_t)WSAGetLastError();
        lua_pushstring(ls, msg.c_str());
        return lua_error(ls);
        }
      }

    luaL_getmetatable(ls, gk_tcp_register);
    if(lua_type(ls, -1) == LUA_TNIL)
      {
      lua_pop(ls, 1);
      luaL_newmetatable(ls, gk_tcp_register);
      lua_pushvalue(ls, -1);
      lua_setfield(ls, -2, "__index");
      luaL_setfuncs(ls, gkTCPLib, 0);
      lua_pop(ls, 1);
      }
    else
      {
      lua_pop(ls, 1);
      }

    SOCKET_ST* st = (SOCKET_ST*)lua_newuserdata(ls, sizeof(*st));
    st->sock = sock;
    st->addr = addr;
    st->bind_port = bind_port;

    luaL_setmetatable(ls, gk_tcp_register);
    return 1;
    }
  catch(const runtime_error& err)
    {
    shutdown(sock, SD_BOTH);
    closesocket(sock);
    xmsg msg;
    msg << "建立TCP错误:" << err.what();
    lua_pushstring(ls, msg.c_str());
    return lua_error(ls);
    }
  catch(...)
    {
    shutdown(sock, SD_BOTH);
    closesocket(sock);
    lua_pushstring(ls, "建立TCP异常");
    return lua_error(ls);
    }
  }