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

我使用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
    评论
答:Python requests.post参数是指使用requests库发送HTTP POST请求时,可以指定的参数。当使用 Python 的 requests 库进行 POST 请求时,可以通过传递参数来定制请求的行为。下面是一些常用的参数: 1. url: 需要访问的 URL 地址 2. data: 需要 POST 的数据,可以是一个字典、元组列表或者文件对象 3. json: 以 JSON 编码的数据,如果传递了该参数,则 data 参数会被忽略 4. headers: 字典类型,HTTP 请求的头部信息 5. auth: HTTP 基本身份验证,可以是一个元组,例如 ('username', 'password') 6. cookies: 字典类型,发送请求时的 cookies 7. timeout: 设定超时时间,以秒为单位 8. allow_redirects: 布尔类型,是否允许重定向,默认为 True 9. proxies: 字典类型,设置代理服务器 10. verify: 布尔类型,是否验证 SSL 证书 11. files: 字典类型,需要上传的文件,可以使用元组列表传递多个文件 12. stream: 布尔类型,是否立即下载响应内容,默认为 False 下面是一个示例代码: ```python import requests url = 'http://httpbin.org/post' data = {'username': 'testuser', 'password': 'testpass'} response = requests.post(url, data=data) print(response.status_code) print(response.text) ``` 该示例代码发送一个 POST 请求到 http://httpbin.org/post,并携带了一个名为 data 的参数,值为 {'username': 'testuser', 'password': 'testpass'}。服务器会将请求的内容封装成一个 JSON 格式的响应,并返回给客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值