服务器忽略客户端的消息,在客户端获取服务器响应超时后,如何让服务器忽略来自客户端的已发送数据?...

我使用O_NONBLOCK套接字,选择,保持活动连接,并像HTTP一样。

每个服务器连接和客户端都使用一个缓冲区来获取所有发送的数据,直到收到完整的消息

如何工作:

客户端发送数据“A”

客户端尝试从服务器接收响应

服务器收到但不立即回复

客户端获取超时

服务器发送响应“A”(但客户端现在不接收)

另一个要求:

客户端发送数据“B”

服务器发送响应“B”

客户端接收“AB”响应而不是“B”

问题是客户端收到以前的缓冲区消息

源代码如下:

Server.cpp基类:

bool Server::start()

{

struct sockaddr_in client_addr;

SOCKET client_socket, max_sock;

Connection* conn;

int addrlen = sizeof(struct sockaddr_in);

std::list::iterator it, itr;

int response;

fd_set fdset, read_fds;

max_sock = m_socket;

FD_ZERO(&fdset);

FD_SET(m_socket, &fdset);

onStart();

while(true)

{

// make a copy of set

read_fds = fdset;

// wait for read event

response = select(max_sock + 1, &read_fds, NULL, NULL, NULL);

if(response == -1)

break;

// check for new connections

if(FD_ISSET(m_socket, &read_fds))

{

response--;

// accept connections

client_socket = accept(m_socket, (struct sockaddr*)&client_addr, &addrlen);

if(client_socket != INVALID_SOCKET)

{

conn = new Connection(*this, client_socket, &client_addr);

m_connections.push_front(conn);

// add connection to set for wait for read event

FD_SET(client_socket, &fdset);

// allow select new sock from select funcion

if(max_sock < client_socket)

max_sock = client_socket;

}

}

// check for received data from clients

it = m_connections.begin();

while(it != m_connections.end() && response > 0)

{

conn = *it;

// verify if connection can be readed

if(FD_ISSET(conn->getSocket(), &read_fds))

{

response--;

conn->receive();

if(!conn->isConnected())

{

FD_CLR(conn->getSocket(), &fdset);

// remove connection from list

itr = it;

it++;

m_connections.erase(itr);

delete conn;

continue;

}

}

it++;

}

}

onFinish(response >= 0);

return response >= 0;

}main.cpp服务器实现:

void ClientConnection::onReceive(const void * data, size_t size)

{

const char *str, *pos = NULL;

HttpParser* p;

buffer->write(data, size);

do

{

str = (const char*)buffer->data();

if(contentOffset == 0)

{

pos = strnstr(str, buffer->size(), "\r\n\r\n");

if(pos != NULL)

{

contentOffset = pos - str + 4;

p = new HttpParser((const char*)buffer->data(), contentOffset);

contentLength = p->getContentLength();

delete p;

}

}

if(buffer->size() - contentOffset < contentLength || contentOffset == 0)

return;

proccessRequest();

keepDataStartingOf(contentOffset + contentLength);

}

while(buffer->size() > 0);

}客户端代码是一个简单的recv发送超时

任何想法如何解决?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值