t**********1 发帖数: 550 | 1 struct NetReq {
int64_t _reqID;
int32_t _train; // [0, 5000)
int16_t _start; // [0, 10)
int16_t _length; // [1, 10]
};
struct NetResp {
int64_t _reqID;
int32_t _respID;
int32_t _seat;
};
记住,实际任何商用协议,client必须定期发送heartbeat。否则是设计缺陷,而且是
不可弥补的缺陷。因为如果因为网络原因造成client断连,server不会知道。
我建议heartbeat采用_train=-1,其他随意。heartbeat因该只在idle时候发送。
我的server设定heartbeat + 2秒没有收到任何东西,自动断开连接。
你可以选择不支持hearbeat功能。但是这样你就不能随便断开连接。老老实实total <
500 TCP测试到底。否则我的服务器会自动拒绝所有>500的连接。这不是我的问题,因
为设计缺陷是你选择的,不是我。 |
g****u 发帖数: 252 | 2 请解释下,是不是说我一个socket开两个线程,一个往里写NetReq结构,
一个往外读NetResp结构?seat表示什么?如果输入_train = -1,
seat又应该是什么?为什么reqID是64位,而respID是32位?
<
【在 t**********1 的大作中提到】 : struct NetReq { : int64_t _reqID; : int32_t _train; // [0, 5000) : int16_t _start; // [0, 10) : int16_t _length; // [1, 10] : }; : struct NetResp { : int64_t _reqID; : int32_t _respID; : int32_t _seat;
|
t**********1 发帖数: 550 | 3 我如何实现是我的问题。但是我handle所有socket I/O只用一个线程。
任何参数不对,seat都是-1。
否则seat>=0
【在 g****u 的大作中提到】 : 请解释下,是不是说我一个socket开两个线程,一个往里写NetReq结构, : 一个往外读NetResp结构?seat表示什么?如果输入_train = -1, : seat又应该是什么?为什么reqID是64位,而respID是32位? : : <
|
g****u 发帖数: 252 | 4 进去出来都是128 bit,我刚刚测出来CPU支持每秒8M请求,
换成带宽是1024Mbit,1GB ethernet将将能支持。8M/s搞不定,
5M/s应该没问题。
【在 t**********1 的大作中提到】 : struct NetReq { : int64_t _reqID; : int32_t _train; // [0, 5000) : int16_t _start; // [0, 10) : int16_t _length; // [1, 10] : }; : struct NetResp { : int64_t _reqID; : int32_t _respID; : int32_t _seat;
|
g****u 发帖数: 252 | 5 老魏你有没有可能支持以下两者之一:
- 要么NetResp返回分配的座位
- 要么benchmark结束你的程序推出后你dump出来座位分配方案。
不然没法验证你出票的正确性。
【在 t**********1 的大作中提到】 : struct NetReq { : int64_t _reqID; : int32_t _train; // [0, 5000) : int16_t _start; // [0, 10) : int16_t _length; // [1, 10] : }; : struct NetResp { : int64_t _reqID; : int32_t _respID; : int32_t _seat;
|
t**********1 发帖数: 550 | 6 NetResp本来就返回分配的座位号呀?
【在 g****u 的大作中提到】 : 老魏你有没有可能支持以下两者之一: : - 要么NetResp返回分配的座位 : - 要么benchmark结束你的程序推出后你dump出来座位分配方案。 : 不然没法验证你出票的正确性。
|
g****u 发帖数: 252 | 7 好。我没问题了。
【在 t**********1 的大作中提到】 : NetResp本来就返回分配的座位号呀?
|
n****j 发帖数: 1708 | 8 浪费了点,应该 64 bit 就足够了。另外,一般留几个 bit 做 opcode,比如
heartbeat 。
【在 t**********1 的大作中提到】 : struct NetReq { : int64_t _reqID; : int32_t _train; // [0, 5000) : int16_t _start; // [0, 10) : int16_t _length; // [1, 10] : }; : struct NetResp { : int64_t _reqID; : int32_t _respID; : int32_t _seat;
|
t**********1 发帖数: 550 | 9 可劲儿浪费都没事。俺们赌的是1M/s。
【在 n****j 的大作中提到】 : 浪费了点,应该 64 bit 就足够了。另外,一般留几个 bit 做 opcode,比如 : heartbeat 。
|
t**********1 发帖数: 550 | 10 zhaoce表示反对。为了照顾他的理解力,协议小修改如下:
struct NetReq {
int64_t _reqID;
int32_t _train; // [0, 5000)
int16_t _start; // [0, 10)
int16_t _stop; // [1, 10]
};
struct NetResp {
int64_t _reqID;
int32_t _respID;
int32_t _seat;
};
唯一变化就是length变成stop。这样我自己算length=stop-start。 |
z****e 发帖数: 54598 | 11
没用了,你的算法我看明白了
是傻瓜算法,双循环是最高复杂度
难怪你敢唧唧歪歪,靠,这种算法有个毛现实意义?
【在 t**********1 的大作中提到】 : zhaoce表示反对。为了照顾他的理解力,协议小修改如下: : struct NetReq { : int64_t _reqID; : int32_t _train; // [0, 5000) : int16_t _start; // [0, 10) : int16_t _stop; // [1, 10] : }; : struct NetResp { : int64_t _reqID; : int32_t _respID;
|