- 622
- 369
Есть функция инициализации объекта сокета:
Свою задачу выполняет на отлично, но есть проблемка:
В другой функции
Возможно, поможет: Значения hSocket при одном из запусков(естественно, hSocket меняется)
hSocket при инициализации = 248
hSocket при получении в функции
Решение:
Выделять память malloc'ом
C++:
static void init_socket_instance(lua_State* L, SOCKETH_T hSocket, int family, int type, int protocol) {
if (hSocket == INVALID_SOCKET)
luaL_error(L, "an error occured while creating socket");
SocketInfo iSocket;
ZeroMemory(&iSocket, sizeof(iSocket));
iSocket.hSocket = hSocket;
iSocket.family = family;
iSocket.type = type;
iSocket.protocol = protocol;
lua_pushlightuserdata(L, &iSocket); // Push SocketInfo
luaL_newmetatable(L, SOCKET_DATA_NAME); // Create new metatable for SocketInfo(socket_data)
lua_getglobal(L, "socket"); // Get Global Socket Table(socket)
lua_setfield(L, -2, "__index"); // socket_data.__index = socket
lua_setmetatable(L, -2); // Set metatable of SocketInfo to socket_data
}
Свою задачу выполняет на отлично, но есть проблемка:
В другой функции
check_socket_data
(ниже), при получении этой структуры, данные в ней 'повреждаются', и вместо handler'а сокета, там рандомное число.Возможно, поможет: Значения hSocket при одном из запусков(естественно, hSocket меняется)
hSocket при инициализации = 248
hSocket при получении в функции
check_socket_data
= 1975321384
C++:
static SocketInfo* check_socket_data(lua_State* L) {
return (SocketInfo*)luaL_checkudata(L, 1, SOCKET_DATA_NAME);
}
Проблему решил самоличноЕсть функция инициализации объекта сокета:
C++:static void init_socket_instance(lua_State* L, SOCKETH_T hSocket, int family, int type, int protocol) { if (hSocket == INVALID_SOCKET) luaL_error(L, "an error occured while creating socket"); SocketInfo iSocket; ZeroMemory(&iSocket, sizeof(iSocket)); iSocket.hSocket = hSocket; iSocket.family = family; iSocket.type = type; iSocket.protocol = protocol; lua_pushlightuserdata(L, &iSocket); // Push SocketInfo luaL_newmetatable(L, SOCKET_DATA_NAME); // Create new metatable for SocketInfo(socket_data) lua_getglobal(L, "socket"); // Get Global Socket Table(socket) lua_setfield(L, -2, "__index"); // socket_data.__index = socket lua_setmetatable(L, -2); // Set metatable of SocketInfo to socket_data }
Свою задачу выполняет на отлично, но есть проблемка:
В другой функцииcheck_socket_data
(ниже), при получении этой структуры, данные в ней 'повреждаются', и вместо handler'а сокета, там рандомное число.
Возможно, поможет: Значения hSocket при одном из запусков(естественно, hSocket меняется)
hSocket при инициализации = 248
hSocket при получении в функцииcheck_socket_data
= 1975321384
C++:static SocketInfo* check_socket_data(lua_State* L) { return (SocketInfo*)luaL_checkudata(L, 1, SOCKET_DATA_NAME); }
Решение:
Выделять память malloc'ом
Последнее редактирование: