mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 06:21:28 +00:00
Fix for how uv writes work on linux (they don't copy the buffer automatically) which should enable actually logging in on linux now
This commit is contained in:
parent
90443891d6
commit
53beefd19b
@ -387,9 +387,9 @@ IF(EQEMU_BUILD_SERVER)
|
||||
ADD_SUBDIRECTORY(shared_memory)
|
||||
ADD_SUBDIRECTORY(world)
|
||||
ADD_SUBDIRECTORY(zone)
|
||||
#ADD_SUBDIRECTORY(ucs)
|
||||
ADD_SUBDIRECTORY(ucs)
|
||||
#ADD_SUBDIRECTORY(queryserv)
|
||||
#ADD_SUBDIRECTORY(eqlaunch)
|
||||
ADD_SUBDIRECTORY(eqlaunch)
|
||||
ENDIF(EQEMU_BUILD_SERVER)
|
||||
IF(EQEMU_BUILD_LOGIN)
|
||||
ADD_SUBDIRECTORY(loginserver)
|
||||
|
||||
@ -238,12 +238,14 @@ void EQ::Net::DaybreakConnectionManager::SendDisconnect(const std::string &addr,
|
||||
sockaddr_in send_addr;
|
||||
uv_ip4_addr(addr.c_str(), port, &send_addr);
|
||||
uv_buf_t send_buffers[1];
|
||||
|
||||
send_buffers[0].base = (char*)out.Data();
|
||||
send_buffers[0].len = out.Length();
|
||||
|
||||
|
||||
char *data = new char[out.Length()];
|
||||
memcpy(data, out.Data(), out.Length());
|
||||
send_buffers[0] = uv_buf_init(data, out.Length());
|
||||
send_req->data = send_buffers[0].base;
|
||||
int ret = uv_udp_send(send_req, &m_socket, send_buffers, 1, (sockaddr*)&send_addr,
|
||||
[](uv_udp_send_t* req, int status) {
|
||||
delete[] (char*)req->data;
|
||||
delete req;
|
||||
});
|
||||
}
|
||||
@ -928,7 +930,7 @@ void EQ::Net::DaybreakConnection::Decompress(Packet &p, size_t offset, size_t le
|
||||
|
||||
void EQ::Net::DaybreakConnection::Compress(Packet &p, size_t offset, size_t length)
|
||||
{
|
||||
uint8_t new_buffer[2048];
|
||||
uint8_t new_buffer[2048] = { 0 };
|
||||
uint8_t *buffer = (uint8_t*)p.Data() + offset;
|
||||
uint32_t new_length = 0;
|
||||
|
||||
@ -1115,6 +1117,7 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
|
||||
m_last_send = Clock::now();
|
||||
|
||||
auto send_func = [](uv_udp_send_t* req, int status) {
|
||||
delete[](char*)req->data;
|
||||
delete req;
|
||||
};
|
||||
|
||||
@ -1138,16 +1141,20 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
|
||||
AppendCRC(out);
|
||||
|
||||
uv_udp_send_t *send_req = new uv_udp_send_t;
|
||||
memset(send_req, 0, sizeof(*send_req));
|
||||
sockaddr_in send_addr;
|
||||
uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr);
|
||||
uv_buf_t send_buffers[1];
|
||||
|
||||
send_buffers[0].base = (char*)out.Data();
|
||||
send_buffers[0].len = out.Length();
|
||||
char *data = new char[out.Length()];
|
||||
memcpy(data, out.Data(), out.Length());
|
||||
send_buffers[0] = uv_buf_init(data, out.Length());
|
||||
send_req->data = send_buffers[0].base;
|
||||
|
||||
m_stats.sent_bytes += out.Length();
|
||||
m_stats.sent_packets++;
|
||||
if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) {
|
||||
delete[] (char*)send_req->data;
|
||||
delete send_req;
|
||||
return;
|
||||
}
|
||||
@ -1161,13 +1168,16 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
|
||||
uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr);
|
||||
uv_buf_t send_buffers[1];
|
||||
|
||||
send_buffers[0].base = (char*)p.Data();
|
||||
send_buffers[0].len = p.Length();
|
||||
char *data = new char[p.Length()];
|
||||
memcpy(data, p.Data(), p.Length());
|
||||
send_buffers[0] = uv_buf_init(data, p.Length());
|
||||
send_req->data = send_buffers[0].base;
|
||||
|
||||
m_stats.sent_bytes += p.Length();
|
||||
m_stats.sent_packets++;
|
||||
|
||||
if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) {
|
||||
delete[] (char*)send_req->data;
|
||||
delete send_req;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -118,7 +118,7 @@ namespace EQ {
|
||||
virtual size_t Length() const { return m_data.size(); }
|
||||
virtual size_t Length() { return m_data.size(); }
|
||||
virtual bool Clear() { m_data.clear(); return true; }
|
||||
virtual bool Resize(size_t new_size) { m_data.resize(new_size); return true; }
|
||||
virtual bool Resize(size_t new_size) { m_data.resize(new_size, 0); return true; }
|
||||
virtual void Reserve(size_t new_size) { m_data.reserve(new_size); }
|
||||
protected:
|
||||
std::vector<char> m_data;
|
||||
|
||||
@ -138,11 +138,15 @@ void EQ::Net::TCPConnection::Write(const char *data, size_t count)
|
||||
memset(write_req, 0, sizeof(uv_write_t));
|
||||
write_req->data = this;
|
||||
uv_buf_t send_buffers[1];
|
||||
send_buffers[0].base = (char*)data;
|
||||
send_buffers[0].len = count;
|
||||
|
||||
char *data_out = new char[count];
|
||||
memcpy(data_out, data, count);
|
||||
send_buffers[0] = uv_buf_init(data_out, count);
|
||||
write_req->data = send_buffers[0].base;
|
||||
|
||||
uv_write(write_req, (uv_stream_t*)m_socket, send_buffers, 1, [](uv_write_t* req, int status) {
|
||||
EQ::Net::TCPConnection *connection = (EQ::Net::TCPConnection*)req->data;
|
||||
delete[] (char*)req->data;
|
||||
delete req;
|
||||
|
||||
if (status < 0) {
|
||||
|
||||
@ -445,7 +445,7 @@ int main(int argc, char** argv) {
|
||||
if (!eqsf_open && Config->ZonePort != 0) {
|
||||
Log.Out(Logs::General, Logs::Zone_Server, "Starting EQ Network server on port %d", Config->ZonePort);
|
||||
|
||||
EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, false);
|
||||
EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, true);
|
||||
eqsm.reset(new EQ::Net::EQStreamManager(opts));
|
||||
eqsf_open = true;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user