【发布时间】:2023-03-12 23:11:01
【问题描述】:
我的一个功能的代码有一个很大的问题我为一个游戏编写了这个代码,将数据包从服务器发送到客户端,一切正常,但问题在于服务器尺寸太大.. 尺寸更小,如 100-300效果很好,但我的源代码有问题,因为它们有保护来检查数据包中的缓冲区,如果太棒会阻止发送功能,所以我需要其他我认为的功能或很多优化或其他结构.. 嗯
这里有问题 - TPacket list[1000];
typedef struct testa
{
char t_A[10 + 1];
char t_B[12 + 1];
char t_C[32 + 1];
char t_D[512 + 1];
int t_E;
char t_F[19 + 1];
int t_G;
} TPacket;
typedef struct testb
{
BYTE header;
TPacket list[1000]; // (If i put example 200 etc work) but when is so big = buffer mem_size overflow. memsize(131072) write_pos(32) iSize(598001)
} Test;
// FUNCTION TO SEND:
Test p;
p.header = HEADER_GC_T;
SQLMsg *pMsg = DBManager::instance().DirectQuery("SELECT * FROM table.list ORDER BY date DESC LIMIT 1000");
MYSQL_ROW row;
int i = 0;
if(pMsg->uiSQLErrno != 0)
return;
while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
p.list[i] = TPacket();
strncpy(p.list[i].t_A, row[1], sizeof(p.list[i].t_A));
strncpy(p.list[i].t_B, row[2], sizeof(p.list[i].t_B));
strncpy(p.list[i].t_C, row[3], sizeof(p.list[i].t_C));
strncpy(p.list[i].t_D, row[4], sizeof(p.list[i].t_D));
str_to_number(p.list[i].t_E, row[5]);
strncpy(p.list[i].t_F, row[6], sizeof(p.list[i].t_F) - 1);
str_to_number(p.list[i].t_G, row[7]);
i++;
}
if(pMsg->Get()->uiNumRows < 1000)
{
while (i < 1000)
{
p.list[i] = TPacket();
strncpy(p.list[i].t_A, "", sizeof(p.list[i].t_A));
strncpy(p.list[i].t_B, "", sizeof(p.list[i].t_B));
strncpy(p.list[i].t_C, "", sizeof(p.list[i].t_C));
strncpy(p.list[i].t_D, "", sizeof(p.list[i].t_D));
p.list[i].t_E = 0;
strncpy(p.list[i].t_F, "", sizeof(p.list[i].t_F) - 1);
p.list[i].t_G = 0;
i++;
}
}
ch->GetDesc()->Packet(&p, sizeof(p));
【问题讨论】:
-
听起来真正的问题是您需要使用非阻塞发送。
-
您使用的是 C 还是 C++?如果是 C++,我建议
std::string用于 cstring 和std::vector替换其他数组。 -
这对你的堆栈来说太大了。将
TPacket list[1000];替换为std::vector<TPacket> list(1000); -
正如@πάνταῥεῖ 所说,您正在达到堆栈帧大小限制。您可以使用全局变量或动态分配来实现。
-
“他们有保护从数据包中检查缓冲区”——“他们”是谁,你在说什么数据包?