ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Повреждение данных в структуре (https://forum.antichat.xyz/showthread.php?t=1419020)

RedHolms 25.01.2022 20:08

Есть функция инициализации объекта сокета:

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





Цитата:

Сообщение от HarukiSt

Есть функция инициализации объекта сокета:

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'ом


Время: 12:06