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; }
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; }
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); } }