서버 버그 픽스스
This commit is contained in:
@@ -227,6 +227,7 @@ void ClientManager::sendMessage(Snowflake ID, std::string message) {
|
|||||||
int packetLength = dataPostPacket.__data.packetLength;
|
int packetLength = dataPostPacket.__data.packetLength;
|
||||||
|
|
||||||
data_->recvbytes = data_->sendbytes = 0;
|
data_->recvbytes = data_->sendbytes = 0;
|
||||||
|
data_->transferredbytes = 0;
|
||||||
data_->wsabuf.len = data_->sendbytes = packetLength + 8;
|
data_->wsabuf.len = data_->sendbytes = packetLength + 8;
|
||||||
|
|
||||||
dataPostPacket.convToN();
|
dataPostPacket.convToN();
|
||||||
@@ -245,6 +246,7 @@ void ClientManager::registerUser(std::string userName) {
|
|||||||
int packetLength = loginRequestPacket.__data.packetLength;
|
int packetLength = loginRequestPacket.__data.packetLength;
|
||||||
|
|
||||||
data_->recvbytes = data_->sendbytes = 0;
|
data_->recvbytes = data_->sendbytes = 0;
|
||||||
|
data_->transferredbytes = 0;
|
||||||
data_->wsabuf.len = packetLength + 8;
|
data_->wsabuf.len = packetLength + 8;
|
||||||
|
|
||||||
loginRequestPacket.convToN();
|
loginRequestPacket.convToN();
|
||||||
@@ -263,6 +265,7 @@ void ClientManager::getUserList() {
|
|||||||
int packetLength = usersListRequestPacket.__data.packetLength;
|
int packetLength = usersListRequestPacket.__data.packetLength;
|
||||||
|
|
||||||
data_->recvbytes = data_->sendbytes = 0;
|
data_->recvbytes = data_->sendbytes = 0;
|
||||||
|
data_->transferredbytes = 0;
|
||||||
data_->wsabuf.len = packetLength + 8;
|
data_->wsabuf.len = packetLength + 8;
|
||||||
|
|
||||||
usersListRequestPacket.convToN();
|
usersListRequestPacket.convToN();
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ void IOCP::registerSocket(IOCPPASSINDATA* data) {
|
|||||||
if (returnData == 0)
|
if (returnData == 0)
|
||||||
completionPort_ = returnData;
|
completionPort_ = returnData;
|
||||||
#elif __linux__
|
#elif __linux__
|
||||||
// int flags = ::fcntl(data->socket->sock, F_GETFL);
|
int flags = ::fcntl(data->socket->sock, F_GETFL);
|
||||||
// flags |= O_NONBLOCK;
|
flags |= O_NONBLOCK;
|
||||||
// fcntl(data->socket->sock, F_SETFL, flags);
|
fcntl(data->socket->sock, F_SETFL, flags);
|
||||||
|
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
ev.events = EPOLLIN | EPOLLONESHOT;
|
ev.events = EPOLLIN | EPOLLONESHOT;
|
||||||
|
|||||||
@@ -80,8 +80,28 @@ public:
|
|||||||
IOCPPASSINDATA* rootIocpData = (IOCPPASSINDATA*)event.data.ptr;
|
IOCPPASSINDATA* rootIocpData = (IOCPPASSINDATA*)event.data.ptr;
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(rootIocpData->socket->readMutex);
|
std::lock_guard<std::mutex> lock(rootIocpData->socket->readMutex);
|
||||||
char peekBuffer[1];
|
while (true) {
|
||||||
while (rootIocpData->socket->recv(peekBuffer, 1, MSG_PEEK)) {
|
char peekBuffer[1];
|
||||||
|
int rc = rootIocpData->socket->recv(peekBuffer, 1, MSG_PEEK);
|
||||||
|
if (rc > 0);
|
||||||
|
else if (rc == 0) {
|
||||||
|
spdlog::debug("Client disconnected. [{}]", (std::string)(rootIocpData->socket->remoteAddr));
|
||||||
|
::epoll_ctl(epollfd, EPOLL_CTL_DEL, rootIocpData->socket->sock, NULL);
|
||||||
|
delete rootIocpData;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||||
|
spdlog::trace("No data to read on {}", tid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
spdlog::error("recv() [{}]", strerror(errno));
|
||||||
|
::epoll_ctl(epollfd, EPOLL_CTL_DEL, rootIocpData->socket->sock, NULL);
|
||||||
|
delete rootIocpData;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
|
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
|
||||||
::memcpy(ptr, rootIocpData, sizeof(IOCPPASSINDATA));
|
::memcpy(ptr, rootIocpData, sizeof(IOCPPASSINDATA));
|
||||||
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
|
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
|
||||||
@@ -180,7 +200,7 @@ public:
|
|||||||
pthread_t tid = pthread_self();
|
pthread_t tid = pthread_self();
|
||||||
|
|
||||||
spdlog::trace("epoll waiting on {}", tid);
|
spdlog::trace("epoll waiting on {}", tid);
|
||||||
int nready = ::epoll_wait(epollfd, events, FD_SETSIZE, -1);
|
int nready = ::epoll_wait(epollfd, events, FD_SETSIZE, 1000);
|
||||||
|
|
||||||
for (int i=0; i<nready; i++) {
|
for (int i=0; i<nready; i++) {
|
||||||
struct epoll_event current_event = events[i];
|
struct epoll_event current_event = events[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user